模拟实现 Promise.all

作者: 弱冠而不立 | 来源:发表于2021-03-27 23:02 被阅读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

相关文章

网友评论

    本文标题:模拟实现 Promise.all

    本文链接:https://www.haomeiwen.com/subject/mrzyhltx.html