首页 文章

Promise.all中承诺的多次拒绝,究竟发生了什么?

提问于
浏览
3

Promise.all([iterable])是全有或全无的,这意味着它返回的promise会在iterable中的每个promise解析时解析,或者在promise之一拒绝时拒绝,并拒绝第一个promise的原因(doc ) .

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

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

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

如果我在调试选项中禁用“Uncaught Exceptions”断点,则异常不再显示 .

What exactly is happening here?

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)
   });

这是我看到的启用了Uncaught Exceptions的屏幕截图 .
enter image description here

1 回答

  • 3

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

    第一次拒绝获胜并获得拒绝 Promise.all 承诺的理由 . "First"在这里表示"happening earliest",如果承诺已经被拒绝 Promise.all 访问它们迭代顺序很重要 .

    随后的拒绝将被忽略 .

    如果我在调试选项中禁用“Uncaught Exceptions”断点,则不再显示该异常 .

    那真是怪了 . 忽略拒绝不应导致未处理的拒绝(或未捕获的异常) .

相关问题