结果链接 promise with throw JavaScript

Result chaining promise with throw JavaScript

我真的无法理解 promise 在这里是如何工作的:

Promise.resolve(1)
    .then(x => x + 1)
    .then(x => { throw x })
    .then(x => console.log(x))
    .catch(err => console.log(err)) // 2
    .then(x => Promise.resolve(1))
    .catch(err => console.log(err))
    .then(x => console.log(x)) // 1

来自 MDN:如果 onRejected 抛出错误或 returns 本身被拒绝的 Promise,则 catch() 返回的 Promise 将被拒绝;否则,它已解决。 ,为什么catch之后还不停?

这是正在发生的事情:

  1. Promise.resolve(1) 创建一个由值 1 实现的承诺。
  2. .then(x => x + 1) 向该承诺添加一个履行处理程序,创建一个新的承诺(.then.catch.finally 总是创建承诺)。当 fulfillment 处理程序被调用时,它会将它被调用的 promise 的 fulfillment 值作为 x,添加 1 到它,并使用它来实现它的 promise。
  3. .then(x => { throw x }) 将履行处理程序添加到步骤 2 中的承诺,从而创建新的承诺。调用时,履行处理程序将获取它所附加的承诺的履行值(1 + 12)并将其用于 throw 一个值。这拒绝了第二个 .then 创建的承诺。
  4. .catch(err => console.log(err)) 向该承诺添加拒绝处理程序。当调用拒绝处理程序时,它将拒绝原因(我们知道将是 2)作为 err 并记录下来。由于拒绝处理程序不会抛出错误或 return 被拒绝或将被拒绝的承诺,因此它将拒绝转换为实现。在这种情况下,它使用 console.log 的 return 值来实现它的承诺。该值为 undefined.

...然后再次重复相同的模式。

关键位有:

  • .then.catch.finally 创建承诺
  • 如果您 return 来自履行或拒绝处理程序的值(显式或隐式),并且该值不是被拒绝或将被拒绝的承诺,它履行承诺 .then.catch 使用该值创建。
  • 如果您在 .then.catch 处理程序中抛出(或 return 一个被拒绝或将被拒绝的承诺),您将拒绝承诺 .then.catch 已创建。

如果您对 promises 的术语(“fulfill”、“reject”、“resolve”[上面我没有用,但代码用了])不是很清楚,我have a blog post for that. ;-)