对于Promise的.then()
方法,其实它接受两个参数。第一个参数是处理resolve状态(即成功状态)的回调函数,第二个参数是处理reject状态(即失败状态)的回调函数。也就是说,如果你提供了.then()
的第二个参数,那么它将在Promise被rejected时执行。
然而,一般推荐使用.catch()
处理Promise的错误状态,而非.then()
的第二个参数。使用.catch()
的好处是,它不仅可以捕捉到它之前链式调用中的所有错误,而且排查问题时也更为直观。
这里有一个例子可以帮助你理解:
let promise = new Promise(function(resolve, reject) {
// 模拟一个错误
reject("Error!");
});
promise
.then(
value => {
// 成功的回调函数
console.log("This won't run because the Promise is rejected.");
},
reason => {
// 失败的回调函数
console.log("Something went wrong: ", reason);
}
);
在这个例子中,我们创建了一个立即reject的Promise。.then()
方法的第一个参数将不会被执行,因为Promise没有被resolve。第二个参数会被执行因为Promise被reject了,它将打印出"Something went wrong: Error!"。
需要注意的是,如果.then()
中的第一个回调函数(即处理resolve状态的回调函数)在执行过程中出现错误,那么这个错误是无法被.then()
中的第二个回调函数捕获的,但是可以被随后的.catch()
捕获。