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

时间:2020-05-22 09:13:13

标签: 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()

打印以下输出:

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

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

1 个答案:

答案 0 :(得分:5)

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

您正在执行以下操作:

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

它们是promise链中的两个独立的fork,将被独立捕获。 p被拒绝,p.catchp.catch之后的所有内容恢复它。未链接到p.catch的所有内容都将独立遭受p的拒绝。自await p以来,您就不在链的陷阱中了。

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

相关问题