参考文章ECMAScript 6 入门 #Promise.all()
概述
Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例,一次性处理n个Promise对象。
基础用法
//声明Promise对象
const p1 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('p1 done');
},1500)
})
const p2 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('p2 done');
},1500)
})
const p3 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('p3 done');
},1500)
})
//调用all函数
Promise.all([p1,p2,p3]).then((res)=>{
//process
//console.log('p1 done,p2 done,p3 done') after 4.5s
}).catch((err)=>{
//err
})
示例 1
const arr = [1,2,3,4,5,20,543,623,1234134,656,54325,62463,12412];
let resArr = [];
const returnPromise =(number)=>{
//返回一个Promise对象 且只有resolve
return new Promise((resolve,reject)=>{
setTimeout(()=>{
if(number % 4 === 0){
resolve(true);
}
resolve(false);
},1500)
})
}
//用map函数遍历调用returnPromise()
const promises = arr.map(returnPromise);
//封装多个promise对象 只有当所有对象执行完成之后
Promise.all(promises).then((res)=>{
resArr = res;
console.log(resArr);
//1500ms之后resolve
//[ false,false,false,true,false,true,false..]
//process other
}).catch((err)=>{
console.log(err);
})
//此时Promise对象状态还在pending
console.log(resArr);//[]
注意 ⚠️
- 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
- Promise.all方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。