手写一个Promise.all

91 阅读1分钟
    function PromiseAll(promiseArray) {
        return new Promise((resolve, reject) => {
            if (!Array.isArray(promiseArray)) {
                return reject(new Error('传入的参数必须是数组!'));
            }
            const res = [];
            let count = 0;
            const promiseNums = promiseArray.length;
            for (let i = 0; i < promiseNums; i++) {
                // 不推荐
                // const isPromise = Object.prototype.toString().toLocaleLowerCase(promiseArray[i]) === '[object Promise]';
                // if (isPromise) {
                //     promiseArray[i].then(result => {
                //         res.push(result);
                //     })
                // } else {
                //     res.push(promiseArray[i]);
                // }

                // 忽略promise.all的执行顺序 
                // Promise.resolve((promiseArray[i])).then(value => {
                //     res.push(value);
                //     if (res.length === promiseNums) {
                //         resolve(res);
                //     }
                // })

                Promise.resolve(promiseArray[i]).then(value => {
                    count++;
                    res[i] = value;
                    // 不能用res.length判断,原因:
                    // let arr = [];
                    // arr[6] = 3;
                    // arr.length = 7 
                    if (count === promiseNums) {
                        resolve(res);
                    }
                }).catch(e => reject(e));
            }
        })
    }

    // test
    const pro1 = new Promise((res, rej) => {
        setTimeout(() => {
            res('1');
        }, 1000)
    })

    const pro2 = new Promise((res, rej) => {
        setTimeout(() => {
            res('2');
        }, 2000)
    })

    const pro3 = new Promise((res, rej) => {
        setTimeout(() => {
            res('3');
        }, 3000)
    })

    const proAll = PromiseAll([pro1, pro2, pro3])
        .then(res => console.log(res))
        .catch((e) => console.log(e));