运行2个承诺并等待“done()”

时间:2014-03-24 15:14:19

标签: javascript promise q

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

我想要这样的事情:

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

我该怎么办?

1 个答案:

答案 0 :(得分:4)

您可以使用Q.all功能,就像这样

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

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

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

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

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

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

在这里,我们也可以使用spread便捷方法,但更加细化。对于每个承诺,我们获得一个对象,该对象具有state属性,以便后续消费者知道承诺是否已履行或被拒绝。所以,你可能想要像这样使用传播

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");
    }
});