昨天有说到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的错误处理,如果有错误及来源未附上也欢迎留言指正,那么我们明天见。