javascript - Promise.all 和 Promise.race 有效地做出所有 promise "handled"是记录在案的行为吗?

标签 javascript node.js promise async-await

以下代码 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.racePromise.all有效防止unhandledRejection未赢得比赛但仍被拒绝的 promise 的事件。这是记录在案的行为吗?我似乎在规范中找不到任何提及。

最佳答案

是的,Promise.racePromise.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/

相关文章:

javascript - 操作 HTML/CSS 的 VS 扩展

javascript - Node-Webkit 窗口上下文

javascript - ES6 promise : how to chain functions with arguments

javascript - 为什么我似乎需要 Promise 和回调来将 JSON 数据公开给全局变量?

JavaScript 超时重启

javascript - 如何用 JavaScript 在 Canvas 上绘制圆 Angular 矩形的下半部分

javascript - 将字符串切片为两个变量

javascript - node.js 和 express : how to wait for udp response

JavaScript 箭头函数用于计算调用时间,但不带任何参数

javascript - 同步使用已解决的 promise 数据