Promise()是一个构造函数,通过new调用来创建一个承诺对象,承诺对象主要用于封装异步操作。
一个承诺对象主要有三种状态
承诺发起 pending
承诺成功 resolved
承诺失败 rejected
只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
1) 获取或者创建一个承诺对象
let promise = new Promise(function(resolve,reject){
//异步操作
//当异步操作成功的时候执行resolve(),就可以将承诺的状态由
//pending -> resolved
//当异步操作失败的时候执行reject(),就可以将承诺的状态由
//pending -> rejected
//resolve()和reject()这两个方法里面可以传参,参数为异步处理的结果,最后会将参数传递给then()等方法。
})
当promise实例产生,这个Promise中的回调函数就会执行。通过then方法监听承诺对象状态的改变。
2) 使用承诺对象
Promise.prototype.then(successHandler[,errorHandler])
successHandler 当承诺成功的时候执行
errorHandler 当承诺失败的时候执行
一般不再then方法中添加errorHandler,而是将errorHandler放到catch中
返回值为当前promise实例
Promise.prototype.catch(errorHandler)
errorHandler 当承诺失败的时候执行
Promise.prototype.finally(handler)
handler 不管承诺对象的状态变为什么样子,这个handler函数都会执行
3) 高级特性
1. Promise.all([p1,p2,…])
将多个承诺对象合并为一个承诺对象,返回值为promise
promise .then((result)=>{
//当所有的承诺都resolved的时候该回调函数才会执行
// result 为每个承诺对象返回值组成的一个数组
})
.catch(()=>{
//当有一个承诺对象rejected就会执行这个回调函数
})
2. Promise.race([p1,p2,…])
将多个承诺对象合并为一个承诺对象,返回值为promise
promise .then((result)=>{
//只要有一个承诺对象的状态变为resolved,就会执行该回调函数
})
.catch(()=>{
//只要有一个承诺对象的状态变为rejected,就会执行该回调函数
})
3.Promise.any([p1,p2,…])
将多个承诺对象合并为一个承诺对象,返回值为promise
Promise.any()跟Promise.race()方法很像,只有一点不同,就是不会因为某个 Promise 变成rejected状态而结束。
4. Promise.resolve(v)
将v转换为承诺对象
可以将一个对象转换为一个承诺对象
5. Promise.reject(v)
返回一个状态为rejected的承诺对象
在开发中我们用到的axios是基于promise机制的