模拟实现 Promise.all
2021-03-27 本文已影响0人
弱冠而不立
回顾Promise.all 的定义
Promise.all() 方法接收一个 promise 的 iterable(可迭代) 类型,并且只返回一个 promise 实例,这个 promise 实例的 resolve 的回调结果是一个函数。它的reject回调执行是,只要任何一个输入的promise的reject回调执行或者输入不合法的promise就会立即抛出错误,并且reject的是第一个抛出的错误信息。
关键点:
- 接受的是 promise 类数组
- 返回一个 promise 实例
- 返回的 promise 实例 resolve 回调结果是数组类型,包含了所有传入的promise的结果。
- 返回的 promise 实例 reject 回调结果就是第一次报错的结果。
具体实现:
function myPromiseAll(promiseArr) {
// 如果传入的参数不是可迭代类型
if (promiseArr[Symbol.iterator] === undefined) {
return Promise.reject("params is not a iteratorable type")
}
// 转为数组进行遍历
promiseArr = Array.from(promiseArr);
const resArr = [];
let count = 0
return new Promise((resolve, reject) => {
for (let i = 0; i < promiseArr.length; i++) {
promiseArr[i]
.then(res => {
// 这里之所以不不用 push 是因为, 不能确定哪个promise 先执行完,需要用数组下标进行赋值
resArr[i] = res;
count++;
// 都执行完了然后一起 resolve
if (count === promiseArr.length) {
resolve(resArr);
}
}).catch(err => {
reject(err);
})
}
})
}
使用一下:
const pArr = [
Promise.resolve(1),
new Promise(resolve=>{
setTimeout(()=>{
resolve(2);
},200)
}),
Promise.resolve(3),
]
const pArr_1 = [
Promise.resolve(1),
Promise.reject(2),
Promise.reject(3),
]
myPromiseAll(pArr).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
})
// [1,2,3]
myPromiseAll(pArr_1).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
})
// 2