Promise.all 中的 Promise 被多次拒绝,到底发生了什么?

sme*_*its 6 javascript node.js promise node-pg-pool

Promise.all([iterable])要么全有,要么全无,这意味着当可迭代中的每个 Promise 解析时,它返回的 Promise 都会解析,或者一旦其中一个 Promise 拒绝,它就会拒绝,原因是第一个 Promise 拒绝 ( doc)。

但是如果可迭代拒绝的多个承诺会发生什么?

在 VSCode 中,我尝试了以下示例,并故意使foo()bar()承诺失败。当我在 VSCode 中调试时,我在 * catch(err => Promise.reject('error query bar()'))* 上收到错误,说发生了异常,但我不明白为什么。

我认为这是因为当我调用 Promise.reject 时,Promise.all 已经收到来自 foo 函数的拒绝,该函数也失败了,但不清楚发生了什么。

如果我在调试选项中禁用“未捕获的异常”断点,则异常将不再显示。

这里到底发生了什么?

function foo() {
  return pool.query('insert_test into test (value) values (20)')
    .then(() => client.query('insert into test (value) values (21)'))
    .catch(err => Promise.reject('error query bar()'))
}

function bar() {
  return pool.query('insert_test into test (value) values (20)')
    .then(() => client.query('insert into test (value) values (21)'))
    .catch(err => Promise.reject('error query bar()'))
 }

 Promise.all([foo(), bar()])
   .then(results => {
     console.log(results)
   })
   .catch(err => {
     console.log(err)
   });
Run Code Online (Sandbox Code Playgroud)

这是我在启用“未捕获的异常”时看到的屏幕截图。 在此输入图像描述

Ber*_*rgi 4

但是如果可迭代拒绝的多个承诺会发生什么?

第一个拒绝获胜并得到拒绝承诺的理由Promise.all。这里的“首先”意味着“最早发生”,如果在访问它们时承诺已经被拒绝,那么Promise.all迭代顺序很重要。

随后的拒绝将被忽略。

如果我在调试选项中禁用“未捕获的异常”断点,则异常将不再显示。

这很奇怪。被忽略的拒绝不应导致未处理的拒绝(或未捕获的异常)。