传统方式:
解决这个问题的传统方法是将 Promise 添加到数组中,然后使用 $.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 调用。即使承诺以“随机”顺序完成(只是为了演示),它也清楚地表明建议有效:
JSFiddle: http://jsfiddle.net/TrueBlueAussie/rgj0bx95/5/
注意事项:
其他方法
我发现的小技巧:您可以将 Promise 与 $.when 并行链接,而无需使用 Promise 数组:
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) 进行承诺后,我发现了这一点
- 缺点是它在幕后创建了额外的 Promise 对象,并且最后传递的任何参数都不是很有用(因为它们递归地嵌套在其他对象中)。如果您不需要这些参数,那么它很简短。
您将在下面的小提琴中注意到结果是嵌套的,并且按照您想要的相反顺序排列。同样,此技术仅在您不想要 promise 的结果时才有用(这通常用于并行操作)。
总结:$.when 技术仅在您不关心结果值时才有用。
JSFiddle: http://jsfiddle.net/TrueBlueAussie/rgj0bx95/9/