我试图同时使用promises(使用Q.js)运行两个不同的函数,并等待两者的响应以执行第三个操作。
我想要这样的事情:
run( promise1, promise2).done( callbackForBoth );
我该怎么办?
答案 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");
}
});