Js方法延伸前端开发那些事儿

模拟实现 Promise.all

2021-03-27  本文已影响0人  弱冠而不立

回顾Promise.all 的定义

Promise.all() 方法接收一个 promise 的 iterable(可迭代) 类型,并且只返回一个 promise 实例,这个 promise 实例的 resolve 的回调结果是一个函数。它的reject回调执行是,只要任何一个输入的promise的reject回调执行或者输入不合法的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
上一篇 下一篇

猜你喜欢

热点阅读