es6 Promises:promise 中抛出的异常未被 catch 方法捕获
es6 Promises: exception thrown in a promise is not caught by the catch method
以下代码
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 定义之后立即链接 catch
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)})
认为如果在 promise 拒绝之前设置 catch 可能很重要,但它没有改变任何东西
我在 运行 这些测试节点 12.16.1
谁能解释为什么第一个代码示例中没有捕获异常,而第二个代码示例中捕获了异常?
你正在那里分叉你的链。 (哇,这听起来很奇怪……)
您正在执行与此等效的操作:
const p = Promise.reject();
p.catch(...);
p.catch(...);
这是 promise 链中的两个独立分支,它们将被独立捕获。 p
被拒绝,p.catch
为 p.catch
之后的任何内容恢复它。任何未链接到 p.catch
的内容都将独立经历 p
的拒绝。因为你 await p
,你不在链条的分叉处。
p
被拒绝并触发任何和所有附加的 catch
处理程序,其中可以有多个。 p.catch(...)
另一方面 returns 新的成功 承诺。
以下代码
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 定义之后立即链接 catch
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)})
认为如果在 promise 拒绝之前设置 catch 可能很重要,但它没有改变任何东西
我在 运行 这些测试节点 12.16.1
谁能解释为什么第一个代码示例中没有捕获异常,而第二个代码示例中捕获了异常?
你正在那里分叉你的链。 (哇,这听起来很奇怪……)
您正在执行与此等效的操作:
const p = Promise.reject();
p.catch(...);
p.catch(...);
这是 promise 链中的两个独立分支,它们将被独立捕获。 p
被拒绝,p.catch
为 p.catch
之后的任何内容恢复它。任何未链接到 p.catch
的内容都将独立经历 p
的拒绝。因为你 await p
,你不在链条的分叉处。
p
被拒绝并触发任何和所有附加的 catch
处理程序,其中可以有多个。 p.catch(...)
另一方面 returns 新的成功 承诺。