es6承诺:catch方法未捕获在诺言中引发的异常

问题描述 投票:2回答:1

以下代码

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运行这些测试

谁能解释为什么异常不在第一个代码示例中捕获,而在第二个代码示例中捕获?

javascript promise es6-promise
1个回答
5
投票

您正在那里分叉。 (哇,听起来很奇怪...)

您正在执行以下操作:

const p = Promise.reject();
p.catch(...);
p.catch(...);

这些是承诺链中的两个独立的分支,将被独立捕获。 p被拒绝,p.catch将其恢复为p.catch之后的所有内容。未链接到p.catch的所有内容都会独立遭受p的拒绝。由于您await p,因此您不在链的被抓叉中。

p被拒绝,并触发所有附加的catch处理程序,其中可以有多个处理程序。另一方面,p.catch(...)返回新成功承诺。

© www.soinside.com 2019 - 2024. All rights reserved.