我需要一个详细的解释如何在承诺链的末尾使用一个
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()
)?
回想一下,链中的每个
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)
消息/错误控制台。