以下代码 unhandledRejection
不会因为 p2
而被解雇,即使它也被拒绝,尽管晚于 p1
:
process.on('unhandledRejection', (reason, promise) =>
console.log(`unhandledRejection: ${reason}`));
async function delay(ms) {
await new Promise(r => setTimeout(r, ms));
}
const p1 = async function f1(){
await delay(100);
throw new Error("f1");
}();
const p2 = async function f2(){
await delay(200);
throw new Error("f2");
}();
try {
await Promise.race([p1, p2]);
//await Promise.race([p1]);
}
catch (e) {
console.error(e.message);
}
如果我像这样更改注释行: //await Promise.race([p1, p2]);
await Promise.race([p1]);
... 然后 unhandledRejection
确实会因为 p2
而被解雇,正如预期的那样。对于 Promise.all()
观察到相同的行为.因此,
Promise.race
和 Promise.all
有效防止unhandledRejection
未赢得比赛但仍被拒绝的 promise 的事件。这是记录在案的行为吗?我似乎在规范中找不到任何提及。
最佳答案
是的,Promise.race
和 Promise.all
“处理”您传递给它们的所有 promise 的结果,无论该结果是否与来自 race
的 promise 的结算有关。/all
.所以 Promise.race
中的“失败” promise 仍然被处理,即使来自 Promise.race
的 promise 仅反射(reflect)获胜 promise 发生的情况。同样,如果 Promise.all
拒绝,因为它的输入 promise 之一被拒绝,稍后来自其他输入 promise 的任何拒绝都会被处理,但不会对其进行任何处理。
您可以在规范中看到这一点,它将处理程序与传入的每个 promise 的履行和拒绝都 Hook ,例如在 PerformPromiseRace 的步骤 3.i 中。 :
Perform ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], resultCapability.[[Reject]] »).
关于javascript - Promise.all 和 Promise.race 有效地做出所有 promise "handled"是记录在案的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64317888/