1

私は Web サイトで作業しており、コードのある時点で AJAX 呼び出しを行います。
PART(I)

 for (var i = 0; i < arr.length; i++){
        var id = arr[i].id;
        makeXHRRequest(id);
  }

makeXHRRequest()関数は次のようなものです 。

PART(II)

function makeXHRRequest(id){
var jsonArg = ["id", id];
var jsonString = JsonBuilder(jsonArg);
var requestUrl = getUrl();

$.ajax({
      url: requestUrl,
      type: "POST",
      contentType: 'application/json',
      data: jsonString,
      datatype: "json",
      processdata: false,
      success: function (result, status) {
        console.log(result);
        // TODO check if result is valid
        if(result == null || result == ""){
         //...
        }else{
            for(var i = 0; i < parent.arr.length; i++){
                for(var j = 0; j < count; j++){
                   // !!!!! make another ajax call !!!!!!!!
                    makeAnotherXHRRequest(id);
                }
                }
            }
        }
      },
      error: function (xhr, ajaxOptions, thrownError) {
          console.log("in get groupUsers fail");
      }
});

}

これらはネストされた AJAX 呼び出しであることに注意してください - >part(I)上記で行われた各 ajax 呼び出しは、 で一連のサブ ajax 呼び出しを発行しpart(II)ます。だから私の質問は、プログラムがすべてのデータの準備ができた後に何らかのタスクを実行したい場合、プログラムはどのようにしpart(I)てすべての要求とすべての要求がpart(II)終了したかを知ることができますか?

4

1 に答える 1

3

jQuery のAjax メソッドはDeferred オブジェクト、別名promise を返します。これは、完了しているかどうかをリッスンできます。あなたの場合、それらを配列に集めることができます。次に、promise がすべて解決され$.whenている場合は、promise をリッスンします。

var promises = [];

function makeXHRRequest(id){
  ...
  //we return the ajax promise
  return $.ajax(..
  ...
}

for (var i = 0; i < arr.length; i++){
  ...
  //we store the promise
  promises.push(makeXHRRequest(id));
}


$.when
 .apply(null,promises) //listen to all the promises
 .done(function(){

   /*code here executes when all ajax promises resolves*/

 });
于 2013-04-22T03:02:57.570 に答える