「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」
Promise中常用的操作
-
.then()操作,这个应该是用的最多的了,当Promise对象执行resole()时就会走.then(),.then()中有两个回调,一个是成功的回调一个是失败的回调,一般失败的回调都不写,都用.catch()来处理失败的回调,.then()操作返回的是Promise实例,因此可以使用链式调用,也就是可以.then()后边跟.then()
-
.catch()操作,相当于.then()操作中的第二个回调函数,调用reject()就会走.catch(),还有一种情况是,如果在resolve的回调的时候出现了某种错误,也会走入.catch()中
-
.all()操作,它的参数是一个数组,并且数组的每项都必须是一个Promise对象,只有当所有项的状态都变成resolved时,all()才会走.then(),否则就会走.catch()(注意:如果走了catch(),那么结果就是第一个reject()抛出的值),当all()的状态是resolved的时候,它的回调的参数也是一个数组,数组中的项的内容就是all()参数中数组各项resolve的内容,顺序也和参数的顺序一样,如下:
let a = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(6);
},5000)
});
let b = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(5);
},3000)
});
let c = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(8);
},2000)
});
Promise.all([a,b,c]).then(res=>{
console.log(res);
})
运行结果如下:
这里要注意
使用场景:当需要多个promise的resolve()结果按顺序执行后边的内容时,或者需要都执行成功的情况下再执行特定操作的时候(比如多个promise都成功了再加载页面,否则loading)。还需要特别注意的一点是all()参数中的项并不是按顺序执行的,如下截图可知
- race()操作,race的参数和all一模一样,都是一个数组,并且数组的项要是Promise对象,race()的执行结果取决于参数中那个promise对象先执行完,那个先执行完race()就以谁来执行,不论它是resolve还是reject(),如下例子
let a = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(6);
},5000)
});
let b = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(5);
},3000)
});
Promise.race([a,b]).then(res=>{
console.log(res);
})
运行结果如下:
let e = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(6);
},5000)
});
let f = new Promise((resolve,reject)=>{
setTimeout(()=>{
reject(5);
},3000)
});
Promise.race([e,f]).then(res=>{
console.log(res);
}).catch(err =>{
console.log('reject',err)
})
结果如下:
使用场景: 比如图片加载时,我们可以再写一个定时器来作为另一个promise,如果图片请求的时间比定时器的时间长,那么就输出图片超时等等(race()记住就是谁跑的快结果执行谁就行了,不区分resolve()和reject())
- finally()操作,finally()的意思就是不论promise对象的执行结果是resolve()还是reject()都会执行finally()中的内容
使用场景: 当一个promise对象不管是resolve()还是reject()的时候都要进行某项操作时就可以使用finally(),这时就不用在.then()和.catch()重复写两边相同的内容了;也可以用于当执行完.then()或者.catch()后,还需要执行别的内容的时候使用。