Mic*_*elB 2 javascript promise es6-promise
以下代码
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()Run Code Online (Sandbox Code Playgroud)
打印以下输出:
exception caught
flow interrupted
Run Code Online (Sandbox Code Playgroud)
意思是,即使 catch 方法正在运行,也没有捕获异常
现在,如果我进行这个看似无关的编辑并在承诺定义之后立即链接捕获
exception caught
flow interrupted
Run Code Online (Sandbox Code Playgroud)
输出变成
exception caught
flow completed
Run Code Online (Sandbox Code Playgroud)
我尝试定义承诺,就像
const p = new Promise((resolve, reject) => {setTimeout(reject, 100)})
认为如果在承诺拒绝之前设置捕获可能很重要,但它没有改变任何东西
我在节点 12.16.1 上运行这些测试
谁能解释为什么异常没有在第一个代码示例中被捕获,而是在第二个代码示例中被捕获?
你在那里分叉你的链条。(哇,这听起来很奇怪……)
你正在做的相当于:
const p = Promise.reject();
p.catch(...);
p.catch(...);
Run Code Online (Sandbox Code Playgroud)
这是 promise 链中两个独立的分叉,它们将被独立捕获。p被拒绝,p.catch为后面的任何东西恢复它p.catch。任何没有被束缚的东西p.catch都会经历p独立的拒绝。既然你await p,你就没有陷入链条的叉叉。
p被拒绝并触发任何和所有附加的catch处理程序,其中可以有多个。p.catch(...)另一方面返回一个新的成功承诺。
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |