以下代码
const run = async() => {
try {
const p = Promise.reject()
p.catch(() => console.log('exception caught'))
await p
console.log('flow completed')
} catch {
console.log('flow interrupted')
}
}
run()
打印以下输出:
exception caught
flow interrupted
意味着,即使catch方法正在运行,也不会捕获到异常
现在,如果我进行此看似无关紧要的编辑,并在promise定义之后立即将捕获量链接起来
const run = async() => {
try {
const p = Promise.reject().catch(() => console.log('exception caught'))
await p
console.log('flow completed')
} catch {
console.log('flow interrupted')
}
}
run()
输出变为
exception caught
flow completed
我试图像const p = new Promise((resolve, reject) => {setTimeout(reject, 100)})
认为如果在承诺否决之前设置捕获量可能会很重要,但它并没有改变任何内容
我正在使用节点12.16.1运行这些测试
谁能解释为什么异常不在第一个代码示例中捕获,而在第二个代码示例中捕获?
您正在那里分叉。 (哇,听起来很奇怪...)
您正在执行以下操作:
const p = Promise.reject();
p.catch(...);
p.catch(...);
这些是承诺链中的两个独立的分支,将被独立捕获。 p
被拒绝,p.catch
将其恢复为p.catch
之后的所有内容。未链接到p.catch
的所有内容都会独立遭受p
的拒绝。由于您await p
,因此您不在链的被抓叉中。
p
被拒绝,并触发所有附加的catch
处理程序,其中可以有多个处理程序。另一方面,p.catch(...)
返回新成功承诺。