下面是使用 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: