所有AJAX请求完成?

时间:2013-04-22 02:51:53

标签: javascript ajax multithreading asynchronous

我正在一个网站上工作,在我的代码中,我做了一些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调用 - &gt;上面part(I)中的每个ajax调用都会在part(II)中发出一堆子ajax调用。所以我的问题是,如果程序想要在所有数据准备就绪后执行某项任务,那么程序如何知道part(I)中所有请求以及part(II)中的所有请求何时完成?

1 个答案:

答案 0 :(得分:2)

jQuery中的

Ajax methods返回Deferred objects,又名 promises ,如果它们已经完成,你可以收听。在您的情况下,我们可以将它们收集到一个数组中。然后,如果全部已解决,我们会使用$.when来听取承诺。

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*/

 });