结果链接 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之后还不停?
这是正在发生的事情:
Promise.resolve(1)
创建一个由值 1
实现的承诺。
.then(x => x + 1)
向该承诺添加一个履行处理程序,创建一个新的承诺(.then
、.catch
和 .finally
总是创建承诺)。当 fulfillment 处理程序被调用时,它会将它被调用的 promise 的 fulfillment 值作为 x
,添加 1
到它,并使用它来实现它的 promise。
.then(x => { throw x })
将履行处理程序添加到步骤 2 中的承诺,从而创建新的承诺。调用时,履行处理程序将获取它所附加的承诺的履行值(1 + 1
是 2
)并将其用于 throw
一个值。这拒绝了第二个 .then
创建的承诺。
.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. ;-)
我真的无法理解 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之后还不停?
这是正在发生的事情:
Promise.resolve(1)
创建一个由值1
实现的承诺。.then(x => x + 1)
向该承诺添加一个履行处理程序,创建一个新的承诺(.then
、.catch
和.finally
总是创建承诺)。当 fulfillment 处理程序被调用时,它会将它被调用的 promise 的 fulfillment 值作为x
,添加1
到它,并使用它来实现它的 promise。.then(x => { throw x })
将履行处理程序添加到步骤 2 中的承诺,从而创建新的承诺。调用时,履行处理程序将获取它所附加的承诺的履行值(1 + 1
是2
)并将其用于throw
一个值。这拒绝了第二个.then
创建的承诺。.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. ;-)