catch简介
catch方法的作用:
很多情况我们只需传promise的成功态(resolved)下调用的then方法的第一个处理函数,所以为了更好的语义化,我们使用then方法专门处理resolved态,使用catch方法专门处理rejected态。
catch方法的本质:
catch的本质是then方法的特例,即:then(null,err => {}); 不处理成功态,只处理失败态。
catch的基本用法
Promise的错误不会消失,直到被捕获为止:
new Promise((resolve,reject)=>{
reject('reason');
}).then(data => { // 处理成功态
console.log(data); // 未输出
}).catch(err => { // 捕获失败
console.log(err); // 输出'reason'
})
catch()可以捕获它前面为被处理或捕获的错误,一般总是建议,Promise对象后面要跟catch方法,这样可以处理Promise内部发生的错误。
catch方法跟then方法一样,会返回一个新的promise,默认情况也是resolved状态。如果是失败状态则需手动修改,或者直接将新的错误抛出。
new Promise((resolve,reject)=>{
reject('reason');
}).then(data => { // 处理成功态
console.log(data); // 未输出
}).catch(err => { // 捕获失败
//1.直接抛出
throw new Error('reason2');
}).catch(err =>{
console.log(err); //输出 Error:reason2
//2.手动修改
return new Promise((resolve,reject) => {
reject('reason3');
})
}).catch(err => {
console.log(err); //输出 reason3
})
知识拓展:Promise的finally方法
1.什么时候执行finally:
当Promise的状态发生变化时,finally就会执行,无论是成功态还是失败态。
2.finally无法接受参数;
new Promise((resolve,reject)=>{
//reject('reason');
resolve();
}).finally(()=>{
console.log("执行"); //无论是失败态还是成功态都输出 “执行”
})
// finally的本质:等同于
new Promise((resolve,reject)=>{
reject();
}).then(
result =>{
return result;
},
err =>{
throw err;
}
)
|