手写一个类似于 JavaScript 中 Promise.all 功能的函数实现。Promise.all 的核心作用是处理多个 Promise 对象:当所有 Promise 都成功解决(resolved)时,返回一个包含所有结果的数组;如果有任何一个 Promise 被拒绝(rejected),则立即拒绝并返回拒绝原因。
下面是一个简洁的 JavaScript 代码示例,实现了一个自定义的 myPromiseAll 函数。代码中使用了基本的 Promise 机制,并考虑了边界情况(如空输入):
function myPromiseAll(promises) {return new Promise((resolve, reject) => { // 如果输入为空或不是可迭代对象,直接解决为一个空数组 if (!Array.isArray(promises) || promises.length === 0) { resolve([]); return; }
const results = new Array(promises.length); // 存储每个 Promise 的结果 let completedCount = 0; // 计数器,跟踪已完成的 Promise 数量
promises.forEach((promise, index) => { // 确保每个元素都被包装为 Promise(处理非 Promise 值) Promise.resolve(promise) .then(value => { results[index] = value; // 存储成功结果 completedCount++; // 当所有 Promise 都完成时,解决返回的 Promise if (completedCount === promises.length) { resolve(results); } }) .catch(error => { reject(error); // 有任何拒绝,立即拒绝返回的 Promise }); }); });}
运行结果
const p1 = Promise.resolve(1);const p2 = new Promise((resolve) => setTimeout(() => resolve(2), 100));const p3 = Promise.reject("Error occurred");
// 测试所有成功myPromiseAll([p1, p2]).then(results => console.log(results)); // 输出: [1, 2]
// 测试有失败myPromiseAll([p1, p3]).catch(error => console.error(error)); // 输出: "Error occurred"
这个实现的关键点:
高效处理异步:使用计数器确保只在所有 Promise 完成时解决。
错误处理:任何一个 Promise 拒绝时,立即拒绝返回的 Promise。
兼容性:通过 Promise.resolve 包装输入,处理非 Promise 值(如数字或字符串)。