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的屏幕截图 .
1 回答
第一次拒绝获胜并获得拒绝
Promise.all
承诺的理由 . "First"在这里表示"happening earliest",如果承诺已经被拒绝Promise.all
访问它们迭代顺序很重要 .随后的拒绝将被忽略 .
那真是怪了 . 忽略拒绝不应导致未处理的拒绝(或未捕获的异常) .