Promise.all 和 Promise.race 是否有记录的行为有效地使所有承诺“得到处理”?

2024-01-07

下面,代码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(使用前将#替换为@)

Promise.all 和 Promise.race 是否有记录的行为有效地使所有承诺“得到处理”? 的相关文章

随机推荐