请用 JavaScript 手写实现 Promise.all 方法,并给出完整代码。
考察说明
考查对 Promise 原理及异步并发控制的理解和实现能力。
回答思路
- 【回答框架 1】Promise.all 需返回一个新的 Promise,内部遍历传入的可迭代对象,将每个元素用 Promise.resolve 包装以兼容非 Promise 值。
- 【回答框架 2】使用计数器记录已完成的 Promise 数量,将结果按原顺序存入数组,当所有 Promise 都 resolved 时,resolve 结果数组。
- 【回答框架 3】若任一 Promise 被 rejected,则立即 reject,忽略后续结果。需处理空可迭代对象的情况,此时直接 resolve 空数组。
- 【回答框架 4】实现时需注意处理迭代过程中的异常,例如传入不可迭代对象时应 reject。
- 【回答框架 5】代码结构:返回 new Promise,在 executor 中遍历并收集结果,使用计数器判断完成状态。
- 【关键点 1】返回新的 Promise,内部用计数器跟踪完成数量
- 【关键点 2】结果按原顺序存储,确保顺序一致
- 【关键点 3】任一 rejected 则整体 rejected,空数组直接 resolve
- 【易错点 1】忘记用 Promise.resolve 包装非 Promise 值
- 【易错点 2】数组长度不固定时使用固定索引可能导致稀疏数组问题
- 【易错点 3】未处理传入非可迭代对象的情况