下面,代码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()
.
Thus, Promise.race
and Promise.all
有效防止unhandledRejection
未赢得比赛但仍被拒绝的承诺事件。这是有记录的行为吗?我似乎在规格中找不到任何提及这一点的信息。
Yes, Promise.race
and Promise.all
“处理”您传递给他们的所有承诺的结果,无论该结果是否与承诺的结算相关race
/all
。所以“失去”的承诺Promise.race
仍然被处理,即使承诺来自Promise.race
仅反映获胜承诺所发生的情况。同样,如果Promise.all
拒绝是因为其输入承诺之一拒绝,随后其他输入承诺的任何拒绝都会被处理,但不会对其进行任何处理。
您可以在规范中看到这一点,它将处理程序与传入的每个承诺的履行和拒绝挂钩,例如在步骤 3.i 中履行承诺赛跑 https://tc39.es/ecma262/#sec-performpromiserace:
履行 ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], resultCapability.[[Reject]] »).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)