我已经阅读了有关延期和承诺的内容,但我仍然不知道如何管理它。
for(...){//we don't know the number of ajax calls
$.ajax({...});
}
if(all the ajax call we made are done){...}
关键是我需要保持“ajax.async = true”。
答案 0 :(得分:4)
解决此问题的传统方法是将promises添加到数组中,然后使用$.when.apply
var promise = [];
for (var i = 0; i < 6; i++){
promise.push(delay(10-i, $('#' + i)));
}
$.when.apply($, promise).done(function(){
alert("All done");
});
JSFiddle: http://jsfiddle.net/TrueBlueAussie/rgj0bx95/1/
如果您想保留这些值,则可以使用arguments
数组访问它们:
var promise = [];
for (var i = 0; i < 6; i++){
promise.push(delay(6-i, $('#' + i)));
}
$.when.apply($, promise).done(function(){
$('body').append("All done!");
for (var i = 0; i < arguments.length; i++){
$('body').append(arguments[i]).append("<br/>");
}
});
以下示例使用一个简单函数,该函数使用计时器返回一个promise来模拟ajax调用。它清楚地显示了该建议的工作,即使承诺在&#34;随机&#34;订单(只是为了演示):
JSFiddle: http://jsfiddle.net/TrueBlueAussie/rgj0bx95/5/
我发现的小技巧:您可以与$.when
并行链接承诺,而不必使用一系列承诺:
var promise; // Undefined also means a resolved promise to $.when
for(...){//we don't know the number of ajax calls
promise = $.when(promise, $.ajax({...}));
}
promise.done(function(){
alert("All done");
});
promise = promise.then(newpromise)
您将在下面的小提琴中注意到结果是嵌套的,并且按照您想要的相反顺序。同样,只有当不想要承诺的结果时(这通常用于并行操作),此技术才有用。
摘要:$.when
技术仅在您不关心结果值时才有用。