javascript - 使用 $.when.apply 的简单替代方法并行链接 jQuery promises

标签 javascript jquery promise jquery-deferred

当顺序使用 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;

JSFiddle: http://jsfiddle.net/TrueBlueAussie/ts1dqwe3/4/

关于javascript - 使用 $.when.apply 的简单替代方法并行链接 jQuery promises,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30131137/

相关文章:

javascript - 将已解决的 promise 值传递到最终的 "then"链的最佳方法是什么

javascript - 关于全局对象的几个问题

javascript - 防止提交空字段(包括空格)的最有效的js/jquery方法

javascript - 打印不带标题和日期的数据表?

javascript - jQuery 验证边框颜色

node.js - Node Promises 如何进入 `nextTick` 和 `setImmediate` 之间?

java - 使用 JAX-RS 的列表查询参数创建 URI

php - html 引用与 php 混淆

javascript - 达到一定时间后停止计时器

javascript - 为什么在继续使用下一个 .then() 之前,我的 Firestore 调用没有解析?