promise.all手动实现
时间: 2025-01-08 10:39:16 浏览: 9
### 手动实现 `Promise.all`
为了更好地理解 `Promise.all` 的工作原理,下面提供了一个手动实现该方法的方式。此实现基于 JavaScript Promises API。
#### 实现逻辑
当传入一组承诺对象时,`Promise.all` 应返回一个新的 Promise 对象。这个新的 Promise 将会在所有输入的 Promise 都成功解决后被解析为一个包含各 Promise 解析结果组成的数组;如果任何一个输入的 Promise 被拒绝,则整个 `Promise.all` 返回的新 Promise 会立即以第一个失败的原因而被拒绝[^1]。
下面是具体的代码实现:
```javascript
function myPromiseAll(promises) {
return new Promise((resolve, reject) => {
let results = [];
let completedCount = 0;
if (promises.length === 0) {
resolve([]);
}
promises.forEach((promise, index) => {
Promise.resolve(promise).then(
value => {
results[index] = value;
completedCount++;
if (completedCount === promises.length) {
resolve(results);
}
},
reason => {
reject(reason);
}
);
});
});
}
```
这段代码定义了函数 `myPromiseAll`, 它接受一个由 Promise 组成的数组作为参数,并创建一个新的 Promise 来跟踪这些 Promise 的完成情况。每当有一个内部 Promise 成功执行完毕时,就会更新计数器以及存储其结果的位置。一旦所有的 Promise 均已完成,便会调用外部 Promise 的 `resolve` 函数传递最终的结果列表给使用者。如果有任何 Promise 发生错误,则立刻触发外部 Promise 的 `reject` 并停止进一步的操作[^3]。
阅读全文