Promise是异步编程的一种解决方案,Promise是一个对象,可以获取一步操作的消息,他的出现大大改善了异步编程的困难,避免了回调地狱,它比传统的回调函数更合理,更强大。
所谓Promise,简单来说就是一个容器,里面曹存折某个未来才会结束的事件,通常是一个异步操作的结果。从语法上说,Promise就是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方式进行处理。
(1)Promise的实例有三个状态:
① Pending (进行中)
② Resolved(已完成)
③ Rejected(已拒绝)
当把一件事交给Promise时,它的状态就是Pending,任务完成了状态就变成了Resolved,没有完成失败了就变成了Rejected。
(2)Promise的实例有两个过程:
① pending => fulfilled : resolved (已完成)
② pending => rejected : rejected (已拒绝)
注意 :一旦从进行状态变成了其他状态就永远不能更改状态了
Promise的特点:
① 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态,pending (进行中),fulfilled(已成功),rejected(已失败)。只有异步操作的结果,才能决定当前是哪一种状态,只有两种可能:从pending 变为fulfilled ,从pending变成rejected 。如果改变已经发生了,再对promise对象添加回调函数,也会立即得到这个结果,这和js事件完全不同,事件的特点是:如果你错过了,再去监听是得不到结果的。
Promise的缺点:
① 无法取消Promise,一旦新建它就会立即执行,无法中途取消。
② 如果不设置回调函数,Promise内部抛出的错误,不会反应到外部
③ 当处于pending状态时,无法得知当前进展到哪个阶段。
如何创建Promise对象:
const pro = new Promise(function(resolve,reject){
if(true){
resolve(value);
} else{
reject(error);
}
});
一般情况下都会使用 new Promise()来创建Promise对象。但是也可以使用promise.resolve 和 promise.reject 这两个方法
Promise的方法:
1.then()
当promise执行的内容符合成功条件是,调用resolve函数,失败就调用reject函数
promise.then(function(value) {
// 成功
}, function(error) {
// 失败
});
then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象状态变成rejected时调用。其中第二个参数可以省略。then方法返回的是一个新的Promise实例。因此可以链式写法。
2.catch()
catch方法相当于then方法的第二个参数,指向reject的回调函数。不过catch方法还有一个作用,就是哎执行resolve回调函数时如果出现错误,抛出异常,不会停止运行,而是进入catch方法中
3.all()
all方法可以完成并行任务,他接收一个数组,数组的每一项都是promise对象。当数组中所有的promise对象的状态都是resolved的时候 all方法的状态就变成resolved,有一个rejeced,那么all方法的状态就是rejected。
let promise1 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(1);
},2000)
});
let promise2 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(2);
},1000)
});
let promise3 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(3);
},3000)
});
Promise.all([promise1,promise2,promise3]).then(res=>{
console.log(res);
//结果为:[1,2,3]
})
4.race()
race方法和all一样,接收的参数是每一项都是promise对象的数组,当最先执行完的时间执行完之后就直接返回该promise对象的值