Promise.all([iterable])是全有或全无,这意味着它返回的 Promise 在 iterable 中的每个 Promise 解析时解析,或者一旦其中一个 Promise 拒绝就拒绝,原因是第一个 Promise 拒绝(doc)。
但是,如果可迭代的多个 promise 被拒绝,会发生什么?
在 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)
});