以下代码
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上运行这些测试
谁能解释为什么异常不在第一个代码示例中捕获,而在第二个代码示例中捕获?
答案 0 :(得分:5)
您正在在那里分叉连锁店。 (哇,听起来很奇怪...)
您正在执行以下操作:
const p = Promise.reject();
p.catch(...);
p.catch(...);
它们是promise链中的两个独立的fork,将被独立捕获。 p
被拒绝,p.catch
为p.catch
之后的所有内容恢复它。未链接到p.catch
的所有内容都将独立遭受p
的拒绝。自await p
以来,您就不在链的陷阱中了。
p
被拒绝并触发任何附加的catch
处理程序,其中可以有多个处理程序。另一方面,p.catch(...)
返回新的成功承诺。