昨天有说到Promise的创建以及then的用法,今天我们来看错误处理。
then onRejected
我们昨天有提到说,then两个函式参数,onFulfilled和onRejected,而onRejected则是Promise物件状态转为rejected时呼叫。
不过在使用时要注意Promise是使用split-callback(分离回呼)风格,所以如果我们这样写:
var promise = new Promise((resolve,reject)=> {
resolve(4)
})
promise
.then((val)=>{
throw Error(“error!!“);
})
.then(null,(error)=>{
console.log('err1',error.message);
return“I'm reject return”
});
是没有办法顺利接到错误的,会直接跳出浏览器的错误警告(qstxsj),
但这不是我们所希望的,所以我们必须这样写:
var promise = new Promise((resolve,reject)=> {
resolve(4)
})
promise
.then((val)=>{
throw Error(“error!!“);
},(err)=>{
console.log(err)
});
所以Promise的错误处理,很容易被无声无息的吞掉。为了避免这个问题,通常我们都会在Promise串炼的末端加上catch()。
catch
catch方法其实跟then(undefined,onRejected)方法一样。两者的区别在于,then(undefined,onRejected)通常针对不同的错误处理作回复,而catch通常对错误作统一的回复。
const promise = new Promise((resolve,reject)=> {
resolve(4)
})
promise
.then((val)=> {
console.log(val)//4
return val + 2
})
.then((val)=> {
console.log(val)//6
throw new Error('error!')
})
.catch((error)=>{
console.log('err',error)
})
等同于:
const promise = new Promise((resolve,reject)=> {
resolve(4)
})
promise
.then((val)=> {
console.log(val)//4
return val + 2
})
.then((val)=> {
console.log(val)//6
throw new Error('error!')
})
.then(null,(error)=>{
console.log('err',error)
})
那如果我们同时写,then(undefined,onRejected)和catch会怎么样呢:
const promise = new Promise((resolve,reject)=> {
resolve(4)
});
promise
.then((val)=> {
console.log(val)//4
throw Error('error!')
})
.then(null,(error)=>{
console.log('err1',error.message);
return“I'm reject return”
})
.catch((err)=> {
console.log(“err2”,err.message);
return“I'm catch return”
})
.then((val)=>{
console.log(val);
},(error)=>{
console.log('err1',error.message);
})
//4
// err1 error!
// I'm reject return
可以看到说是谁在前面就会先显示(qqggcm)。
以上就是Promise的错误处理,如果有错误及来源未附上也欢迎留言指正,那么我们明天见。