我正在一个网站上工作,在我的代码中,我做了一些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)
中的所有请求何时完成?
答案 0 :(得分:2)
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*/
});