AJAX-

2016-04-13 3 views
1

を受信したときの$ .eachの次の反復質問はasked beforeでしたが、それはほぼ4年前ですが、おそらくもっと良い解決策があります。AJAX-

私は$ .each-loopを持っています。時には、の追加データがajax経由で取得されています。

フェッチされたデータをオブジェクトに書き込んでいますが、ループの後にオブジェクトからHTMLを生成する関数があります。 問題は、ajaxデータが到着する前にループが終了することです。 HTML生成機能にアラートを置くと、コンテンツが正しく読み込まれています。

ループとすべてのajax呼び出しが終了したときにのみ、HTMLジェネレータ関数を呼び出すソリューションを探しています。おそらく、開始されたAjaxリクエストを数え、それらのすべてが終了したのを待つソリューションかもしれません。

私はjQuery deferredが私にとって適切なソリューションだと信じていますが、すべてがループ内にとどまっている例だけが見つかります。助けてもらえますか?

私が最も重要なことに私のコードをストリップダウンしている:

//goes through each testplace -->main loop 
$.each(jsobject, function(key, value) 
{ 
//build object together... 
    for (var i = 0, numComputer = jenkinsComputer.contents.computer.length; i < numComputer; i++) 
    { 
    //If the testplace is in both objects then fire AJAX request 
    if (jenkinsComputer.contents.computer[i].displayName == key) //<<<This can happen only once per $.each loop, but it does not happen every time 
    { 
     //next $.each-iteration should only happen when received the JSON 
     var testplaceurl = jenkinsComputer.contents.computer[i].executors[0].currentExecutable.url; 
     $.when($.getJSON("php/ba-simple-proxy.php?url=" + encodeURI(testplaceurl) + "api/json?depth=1&pretty=1")).done(function(jenkinsUser) 
     { 
     //build object together... 
     }); 
    } 
    } 

}); //End of main Loop ($.each) 
generateHTML(builtObject); 

誰かが私にそれを行うにはどのようなアドバイスを与えることができればそれは素晴らしいことです。

+1

ほんの少しのヒント:AJAXをループにすることは良いアイデアになることはありません。よりシンプルに見えるかもしれませんが、サーバーサイドにループをさせるほうが良いでしょう。 –

+0

スクリプト全体が私たちのローカルネットワーク上で実行されています。ほとんどの場合、わずか5〜10人の短いajax呼び出しがあり、ここではネットワークに問題はありません。それはそれのためのjavascriptのソリューションがあれば素晴らしいだろう。 – bademeister

答えて

0

が、私はこのような何かをするだろう:

var thingstodo = $(jsobject).length; 
var notfired = true; 
$.each(jsobject, function(key, value) 
{ 
//build object together... 
    for (var i = 0, numComputer = jenkinsComputer.contents.computer.length; i < numComputer; i++) 
    { 
    //If the testplace is in both objects then fire AJAX request 
    if (jenkinsComputer.contents.computer[i].displayName == key) //<<<This can happen only once per $.each loop, but it does not happen every time 
    { 
     //next $.each-iteration should only happen when received the JSON 
     var testplaceurl = jenkinsComputer.contents.computer[i].executors[0].currentExecutable.url; 
     $.when($.getJSON("php/ba-simple-proxy.php?url=" + encodeURI(testplaceurl) + "api/json?depth=1&pretty=1")).done(function(jenkinsUser) 
     { 
     //build object together... 
     thingstodo--; 
     if(thingstodo === 0 && notfired){ 
      notfired = false; 
      generateHTML(buildObject); 
     } 
     }); 
    }else{ 
     thingstodo--; 
    } 
    } 

}); //End of main Loop ($.each) 
if(thingstodo === 0 && notfired){ 
    generateHTML(buildObject); 
} 
0

これは解決策についての短い例ではありません。私はこれがあなたにアイデアを与えることを望む。

// I guess that jsobject is array .. 
// if it is not object you can use something like: 
// var keys = Object.getOwnPropertyNames(jsobject) 
(function() { 
    var dfd = $.Deferred(); 

    function is_not_finished() { 
     return jsobject.length > 0 && jenkinsComputer.contents.computer.length > 0; 
    } 

    (function _handleObject() { 
     var key = jsobject.shift(); 
     var displayName = jenkinsComputer.contents.computer.shift().displayName; 

     if (displayName == key) //<<<This can happen only once per $.each loop, but it does not happen every time 
     { 
      //next $.each-iteration should only happen when received the JSON 
      var testplaceurl = jenkinsComputer.contents.computer[i].executors[0].currentExecutable.url; 
      $.getJSON("php/ba-simple-proxy.php?url=" + encodeURI(testplaceurl) + "api/json?depth=1&pretty=1").done(function(jenkinsUser) 
      { 
       //build object together... 
       if(is_not_finished()) { 
        setTimeout(_handleObject,0); 
       } else { 
        dfd.resolve(); 
       } 
      }); 
     } else if (is_not_finished()) { 
      setTimeout(_handleObject,0); 
     } else { 
      dfd.resolve(); 
     } 
    }()); 

    return dfd.promise(); 
}()).done(function() { 
    generateHTML(builtObject); 
}); 
+0

ajaxリクエストを非同期で実行するのではなく、実行全体をブロックしています。 – Danmoreng

+0

Hmmm。事実、$はそれぞれsinchronousです。 受信したデータの順序が重要でない場合は、 の解決策はOKです。ここでの鍵は、「受信すると次の反復」です。 また、promiseに依存する$ .eachAsincのようなものを開発することもできます。 $ .getJSONが約束を返すので、あなたのケースでも$ .whenは不要です。 –