Promise的含义
Promise识异步编程的一种解决方案,可以看作一个可以获取异步消息的对象。
作用
避免回调地狱,提供的api可以让异步操作更加简单
三个状态
- Pending(进行中)
- Fulfilled/Resolved(已成功)
- Rejected(已失败)
两个特点
- 对象的状态不受外界影响,只由异步操作的结果决定状态
- 状态改变就不会再变。只能由pending变为resolved或者pending变为rejected
基础用法
var promise = new promise(function(resolve,reject){})
then的用法
then传2个参数,第一个对应resolved的回调函数,第二个对应rejected的回调函数
promise.then((res)=>{
console.log(res)
},(err)=>{
console.log(err)
})
catch的用法
catch是then(null,rejection)的别名,相当于then的第二个参数
promise.then((res)=>{
console.log(res)
}).catch((res)=>{
console.log(res)
})
状态变为resolved,再抛出错误无效
var promise = new promise(function(resolve,reject){
resolve('ok')
throw new Error(error)
})
promise.then((res)=>{
console.log(res)
}).catch((res)=>{
console.log(res)
})
//得到ok
- promise对象的错误具有冒泡性质,错误总会被下一个catch捕获
- catch方法返回的还是一个promise对象,后面还可以接着调用then
promise.all()
将多个promise实例包装成一个promise实例
基础用法
var p = Promise.all([p1,p2,p3])
- 参数是一个数组对象(可以不是,但必须由Iterator接口,且返回都是promise实例)
- 只要数组中有任意一个promise对象状态为rejected,该对象就为rejected。第一个被rejected的实例返回值传递给p。
- 数组所有promise对象状态都为resolved时,该对象为resolved。p1,p2,p3的返回值组成一个数组传给p的回调函数
promise.all()注意点
如果作为参数的Promise实例自身定义了catch方法,则rejected时不会触发Promise.all()的catch方法
const p1 = new Promise((resolve,reject)=>{
resolve('hello')
}).then(result=>result)
.catch(e=>e)
const p2 = new Promise((resolve,reject)=>{
throw new Error('报错了')
}).then(result=>result)
.catch(e=>e)
promise.all([p1,p2]).then((res)=>{
console.log(res)
}).catch((e)=>{
console.log(e)
})
结果为[‘hello’,Error:报错了]
- p2有catch方法,会返回一个新的Promise实例,该实例执行完catch方法后也会变成resolved,所以promise.all()调用then的回调函数,而不是catch。
- p2没有catch方法,就会调用promise.all()的catch方法,直接抛出错误
promise.race()
promise.race()同样是将多个promise实例包装成一个新的promise实例
基础用法
var p = primise.race([p1,p2,p3)]
只要p1,p2,p3中任何一个实例改变状态,p的状态就跟着改变。最先改变的promise实例的返回值就传递给p的回调函数