Promise.all 功能描述
Promise.all 返回值是一个 Promise 实例
Promise.all 接受一个可遍历的数据容器,容器中每个元素都应是 Promise 实例
- 数组中每个
Promise 实例都成功时(由 pendding 状态转化为 fullfilled 状态),Promise.all 才成功。这些 Promise 实例所有的 resolve 结果会按照原来的顺序集合返回在一个数组中作为 Promise.all 的返回结果。
- 数组中只要有一个
Promise 实例失败(状态由 pendding 状态转化为 rejected 状态),Promise.all 就算失败。Promise.all 的 .catch() 会捕获到这个 reject。
Promise.all 手写代码实现
function myPromiseAll(promises){
let count = 0;
const result = [];
return new Promise(function(resolve, reject){
promises.forEach((promise, i)=>{
Promise.resolve(promise).then(res=>{
result[i] = res;
if(++count === promises.length){
resolve(result);
}
}, reject);
});
});
}
测试
const p1 = Promise.resolve('p1');
const p2 = new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve('p2 延时一秒')
}, 1000);
});
const p3 = new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve('p3 延时两秒')
}, 2000);
});
myPromiseAll([p1,p2,p3]).then(res=>console.log(res)).catch(err=>console.log(err));
const p1 = Promise.resolve('p1');
const p2 = new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve('p2 延时一秒')
}, 1000);
});
const p3 = new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve('p3 延时两秒')
}, 1000);
});
const p4 = new Promise((resolve, reject)=>{
setTimeout(()=>{
reject('p4 rejected 延时三秒')
}, 3000);
});
myPromiseAll([p1,p2,p3,p4]).then(res=>console.log(res)).catch(err=>console.log(err));