【问题标题】:Run 2 promises and wait for both for "done()"运行 2 个 promise 并等待“done()”
【发布时间】:2014-03-24 23:28:03
【问题描述】:

我正在尝试同时使用 Promise(使用 Q.js)运行两个不同的函数,并等待两者的响应以运行第三个操作。

我想要这样的东西:

run( promise1, promise2).done( callbackForBoth );

我该怎么办?

【问题讨论】:

  • 不要做.done(callbackForBoth)!这是一种反模式。相反,返回承诺并在调用者站点上添加一个处理程序。

标签: javascript promise q


【解决方案1】:

你可以像这样使用Q.all函数

Q.all([promise1, promise2]).then(callbackForBoth);

通常,Q.all 后面会跟着.spread 便捷方法,它将Q.all 调用的结果作为函数参数传播,就像这样

Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {
    return callbackForBoth();
});

但是这个方法的问题是,如果任何一个 Promise 被拒绝,那么其余的 Promise 将不会被调用。

所以,如果你想确保所有的承诺都被履行/拒绝,你可以在这种情况下使用Q.allSettled

Q.allSettled([promise1, promise2]).then(callbackForBoth);

这里我们也可以使用spread 方便的方法,但粒度要多一点。对于每一个promise,我们都会得到一个对象,它有一个state 属性,让后续的消费者知道promise 是被实现还是被拒绝。因此,您可能希望像这样使用价差

Q.allSettled([promise1, promise2]).spread(function(pro1result, pro2result) {
    if (pro1result.state === "fulfilled" && pro2result.state === "fulfilled") {
        return callbackForBoth();
    } else {
        throw new Error("Not all of them were successful");
    }
});

【讨论】:

  • 谢谢,如果我的 promise 返回一个我需要传递给回调的结果怎么办?
  • 在这种情况下,callbackForBoth 的参数将是一个包含每个承诺结果的数组。您可以结合Q.spread 将这些值传播出去
  • 请在你的答案中写一个例子好吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多