catch方法
.then().catch(cb)
相当于:
.then(null,cb)
Promise对象的错误具有冒泡的性质,会一直向后传递,直到被捕获,推荐使用.catch
方法,因为他不但能捕获前面then方法中的异常且能捕获较早之前未捕获到的异常,而then的第二个参数不能捕获第一个参数中的异常。
// bad
promise
.then(function(data) {
// success
}, function(err) {
// error
});
// good
promise
.then(function(data) { //cb
// success
})
.catch(function(err) {
// error
});
Promise.resolve(arg)
将arg包装成Promise对象
1. arg为基本类型:
var a = 1;
Promise.resolve(1);
相当于:
new Promise(function(resolve){
resolve(1);
});
- arg为Promise对象时直接返回arg
- arg为含有then属性的对象时,将arg转换成Promise对象后立即调用其then方法:
var arg = {
then:function(resolve,reject){
resolve(123);
}
}
Promise.resolve(arg).then(function(value){
console.log(value)
});
输出:123
Promise.reject(arg)
不管arg为什么值都会原封不动的传递给下面的回调:
var arg = {
then:function(resolve,reject){
reject('err')
}
}
Promise.reject(arg).catch(e => {
console.log(e === arg);
});
输出:true
Promise.all
其参数必须是具有Iterator接口。例如数组,且其中的参数必须是Promise实例,若不是,则调用Promise.resolve将其包装成Promise实例。
当所有参数都fulfilled后,将所有参数的返回值包装成数组,传递给下面的then方法
只要有一个参数reject,则 Promise.all 的状态变为rejected,且将第一个reject实例的返回值传递给下面的then方法。
var p1 = function () {
var flag = true;
return new Promise(function (resolve, reject) {
if (flag) {
resolve(1);
} else {
reject(0)
}
});
};
var p2 = function () {
return new Promise(function (resolve) {
resolve(123)
});
};
Promise.all([p1(),p2()]).then(function ([r1,r2]) {
console.log(r1)
console.log(r2)
}).catch(function (err) {
console.log(err)
});
输出:
1
123
将上面代码中的flag置为false,则输出:0
先将flag改为false后,同时在执行p1时为p1添加catch则p1相当于没有发生错误,其reject的值会传递给promise.all的then参数:
var p1 = function () {
var flag = false;
return new Promise(function (resolve, reject) {
if (flag) {
resolve(1);
} else {
reject(0);
}
});
};
var p2 = function () {
return new Promise(function (resolve) {
resolve(123)
});
};
Promise.all([p1().catch(function () {
console.log('in err');
return 'inn err';
}),p2()]).then(function ([r1,r2]) {
console.log(r1)
console.log(r2)
}).catch(function (err) {
console.log(err)
});
输出:
in err
inn err
123
Promise.done
Promise最后不管是then还是catch,若最后一个方法抛出的错误则无法捕获到,则将done方法放在回调链的末端,保证抛出可能出现的异常。
Promise.prototype.done = function(resolve,reject){
this.then(resolve,reject).catch(function(reason){
setTimeout(()=>{throw rease},0);//抛出全局错误
})
}
Promise.finally
不管最终的Promise状态如何都会执行
Promise.prototype.finally = function(cb){
this.then(
value => Promise.resolve(cb(value)).then(msg => {return msg}),//这里的resolve目的是将cb封装成Promise对象
reason => Promise.resolve(cb(value)).then(msg => {return msg})//这里的resolve目的是将cb封装成Promise对象
)
}