Catch() at the end - 拒绝的原因是如何“传递”到链的末端的?

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

我需要一个详细的解释如何在承诺链的末尾使用一个

catch()
来捕获任何错误。

拒绝原因是如何“传递”到链条末端的?

我知道当一个函数没有传递给一个

then()
的第二个参数时它“传递了拒绝的原因”,但我不知道它是否与我的问题有关

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

onRejected Optional

如果 Promise 被拒绝,则异步调用的函数。这 函数有一个参数,拒绝原因。 如果不是 函数,它在内部被替换为抛出函数 ((x) => { 扔 x; }) 抛出它收到的拒绝原因。

 Promise.resolve(6)
 .then(function(data) {
    console.log('then 1:' + data);
    return Promise.reject(new Error('ups - rejected'));
 })
 .then(function (data) {
    console.log('then 2:' + data);
    return data + 1; 
 })
.then(function (data) {
    console.log('then 3:' + data);
    return data + 1; 
 })
 .catch(function(error) { 
  console.log(error);
 });

第一个

then()
被拒绝的promise如何走到最后(到
catch()
)?

javascript asynchronous promise
1个回答
0
投票

回想一下,链中的每个

then
都定义了一个
Promise
,并且它们是按顺序处理的。在“快乐案例”中,没有错误,每个
onFulfilled
处理程序的结果作为参数传递给下一个
Promise
.

类似地,如果发生错误——无论是显式

Promise.reject
还是
throw
——然后错误对象作为参数传递给下一个
onRejected
Promise
处理程序。

如果

onRejected
处理程序返回一个值,那么它将传递给下一个
onFulfilled
处理程序,即错误被视为“已处理”;但是,如果它拒绝或重新抛出错误,那么 将传递给下一个
onRejected
处理程序

您提供的链接阐明了默认的

onRejected
处理程序是
function ((x) => { throw x; })
– 也就是说,如果您没有定义自己的处理程序,那么链中早期的任何错误都会被重新抛出。因此,默认行为是错误只是沿着链向下传递,直到到达末尾。

回想一下,

.catch(handler)
只是
.then(undefined, handler)
的语法糖。它在最后没有什么特别的——你可以把
.catch(..)
处理程序放在链的中间——但是如果链中的一些
Promise
抛出未处理的错误,那么你会看到熟悉的
Uncaught (in Promise)
消息/错误控制台。

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