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.catchp.catch 之后的任何内容恢复它。任何未链接到 p.catch 的内容都将独立经历 p 的拒绝。因为你 await p,你不在链条的分叉处。

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