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)
但是如果可迭代拒绝的多个承诺会发生什么?
第一个拒绝获胜并得到拒绝承诺的理由Promise.all
。这里的“首先”意味着“最早发生”,如果在访问它们时承诺已经被拒绝,那么Promise.all
迭代顺序很重要。
随后的拒绝将被忽略。
如果我在调试选项中禁用“未捕获的异常”断点,则异常将不再显示。
这很奇怪。被忽略的拒绝不应导致未处理的拒绝(或未捕获的异常)。
归档时间: |
|
查看次数: |
2702 次 |
最近记录: |