Javascript 运行2个承诺并等待“完成()
我试图同时使用promissions和Q.js运行两个不同的函数,并等待两者的响应来运行第三个操作 我想要这样的东西:Javascript 运行2个承诺并等待“完成(),javascript,promise,q,Javascript,Promise,Q,我试图同时使用promissions和Q.js运行两个不同的函数,并等待两者的响应来运行第三个操作 我想要这样的东西: run( promise1, promise2).done( callbackForBoth ); 我该怎么做呢?您可以像这样使用函数 Q.all([promise1, promise2]).then(callbackForBoth); Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {
run( promise1, promise2).done( callbackForBoth );
我该怎么做呢?您可以像这样使用函数
Q.all([promise1, promise2]).then(callbackForBoth);
Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {
return callbackForBoth();
});
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");
}
});
通常,Q.all后面跟着.spread便利方法,它将Q.all调用的结果作为函数参数进行传播,如下所示
Q.all([promise1, promise2]).then(callbackForBoth);
Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {
return callbackForBoth();
});
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");
}
});
但是这个方法的问题是,如果任何承诺被拒绝,那么其余的承诺将不会被调用
因此,如果您想确保所有承诺都得到履行/拒绝,您可以在这种情况下使用
Q.allSettled([promise1, promise2]).then(callbackForBoth);
在这里,我们也可以使用spread便利方法,但粒度稍大一些。对于每个承诺,我们都会得到一个对象,该对象有一个state属性,让后续的消费者知道承诺是履行了还是拒绝了。所以,你可能想要像这样使用排列
Q.all([promise1, promise2]).then(callbackForBoth);
Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {
return callbackForBoth();
});
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");
}
});
你可以像这样使用函数
Q.all([promise1, promise2]).then(callbackForBoth);
Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {
return callbackForBoth();
});
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");
}
});
通常,Q.all后面跟着.spread便利方法,它将Q.all调用的结果作为函数参数进行传播,如下所示
Q.all([promise1, promise2]).then(callbackForBoth);
Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {
return callbackForBoth();
});
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");
}
});
但是这个方法的问题是,如果任何承诺被拒绝,那么其余的承诺将不会被调用
因此,如果您想确保所有承诺都得到履行/拒绝,您可以在这种情况下使用
Q.allSettled([promise1, promise2]).then(callbackForBoth);
在这里,我们也可以使用spread便利方法,但粒度稍大一些。对于每个承诺,我们都会得到一个对象,该对象有一个state属性,让后续的消费者知道承诺是履行了还是拒绝了。所以,你可能想要像这样使用排列
Q.all([promise1, promise2]).then(callbackForBoth);
Q.all([promise1, promise2]).spread(function(pro1result, pro2result) {
return callbackForBoth();
});
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");
}
});
谢谢,如果我的承诺返回每一个我需要传递给回调的结果呢?在这种情况下,callbackborboth的参数将是一个包含每个承诺结果的数组。你可以结合Q.spread来分散这些值,你可以在你的答案中写一个例子吗?谢谢,如果我的承诺返回每一个我需要传递给回调的结果呢?在这种情况下,callbackborboth的参数将是一个包含每个承诺结果的数组。你可以结合Q.spread来分散这些值,你可以在你的答案中写一个例子吗?不要这样做。两个都不要!这是一种反模式。相反,返回承诺并在调用方站点上添加一个处理程序。不要这样做。Donecallbackborboth!这是一种反模式。相反,返回承诺并在调用方站点上添加处理程序。