当顺序使用 jQuery promises 时,可以重复使用 then
将它们链接起来:
例如
promise = promise.then(someoperation());
它也可以在循环内工作(非常方便)。
我有类似的场景,我需要知道多个并行操作何时完成,但不经历为调用的唯一目的创建 promise 数组的编码开销(例如增加的复杂性) $.when.apply
在查看了我的选项之后,我想出了这个模式作为替代方案:
promise = $.when(promise, anotherpromise);
为了测试它,我想出了这个测试:
var p = $.Deferred().resolve().promise();
[1,2,3,4,5,6,7,8,9,10].forEach(function(i){
p = $.when(p, delay(i,i * 500));
});
p.then(function(){
log("All done");
});
JSFiddle: http://jsfiddle.net/TrueBlueAussie/0rh8Lhv4/1/
这似乎工作得很好,所以我开始将它应用到 StackOverflow 上的其他示例。
我尝试使用此模式的下一个是修复 Pass in an array of Deferreds to $.when() 中的示例:
我的代码:
$("a").click(function () {
var promise = GetSomeDeferredStuff();
promise.then(function () {
$("div").append("<p>All done!</p>");
});
});
JSFiddle: http://jsfiddle.net/TrueBlueAussie/ts1dqwe3/1/
问。出于某种原因,这个永远不会触发最终事件。任何人都可以发现问题吗?
更新
根据 @Karl-André Gagnon
的评论,最初的 promise
似乎可以未定义但仍然有效。更简单:
例如
var p;
[1,2,3,4,5,6,7,8,9,10].forEach(function(i){
p = $.when(p, delay(i,i * 500));
});
p.then(function(){
log("All done");
});
最佳答案
好吧,事实证明这个模式确实工作得很好,但你需要确保你链接到的初始 promise
已经解决:
function GetSomeDeferredStuff() {
var promise = $.Deferred().resolve().promise();
JSFiddle: http://jsfiddle.ne/TrueBlueAussie/ts1dqwe3/2/
总而言之,这种模式确实是创建仅供$.when.apply
使用的数组的简单替代方法。
另外,正如@Karl-André Gagnon 所指出的,如果您以未定义的值开始,它会做同样的事情。更好:)
function GetSomeDeferredStuff() {
var promise;
关于javascript - 使用 $.when.apply 的简单替代方法并行链接 jQuery promises,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30131137/