手写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: