手写Promise.all

下面是使用 tsx 实现的手写版 Promise.all 函数。Promise.all 接收一个可迭代对象(通常是数组)作为参数,该数组中的每个元素都是一个 Promise 对象,当所有 Promise 都成功完成时,它会返回一个新的 Promise,该 Promise 会在所有 Promise 都成功时以一个包含所有结果的数组来解析;如果其中任何一个 Promise 被拒绝,那么 Promise.all 返回的 Promise 会立即以该拒绝的原因被拒绝。

function customPromiseAll<T>(promises: (Promise<T> | T)[]): Promise<T[]> {
    return new Promise((resolve, reject) => {
        if (!Array.isArray(promises)) {
            return reject(new TypeError('传入的参数必须是数组'));
        }
        const results: T[] = [];
        let completedCount = 0;
        if (promises.length === 0) {
            resolve(results);
            return;
        }
        promises.forEach((promise, index) => {
            Promise.resolve(promise).then((value) => {
                results[index] = value;
                completedCount++;
                if (completedCount === promises.length) {
                    resolve(results);
                }
            }).catch((error) => {
                reject(error);
            });
        });
    });
}

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);

customPromiseAll([promise1, promise2, promise3])
  .then((values) => {
        console.log(values);
    })
  .catch((error) => {
        console.error(error);
    });

上述代码实现了一个自定义的 customPromiseAll 函数,它接收一个 Promise 数组作为参数,返回一个新的 Promise 对象。在函数内部,通过遍历传入的 Promise 数组,为每个 Promise 绑定 then 和 catch 方法。当所有 Promise 都成功完成时,将每个 Promise 的结果存储在 results 数组中,并在所有 Promise 都完成后,使用 resolve 方法返回结果数组;如果有任何一个 Promise 被拒绝,则立即使用 reject 方法返回错误信息。 

成功Promise.all:

失败promise.all: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值