1

我在一个网站上工作,在我的代码中的某个时刻,我进行了一些 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 调用都会在part(II). 所以我的问题是,如果程序要在所有数据准备好后执行某些任务,程序如何知道所有请求何时完成part(I)以及所有请求何时part(II)完成?

4

1 回答 1

3

jQuery 中的Ajax 方法返回Deferred objects,又名promises ,如果它们完成与否,您可以收听它们。在您的情况下,我们可以将它们收集到一个数组中。然后$.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 回答