手写Promise.all
时间: 2023-07-06 14:43:19 浏览: 100
Promise.all() 方法接收一个 Promise 对象的数组作为参数,返回一个新的 Promise 对象。当数组中所有的 Promise 对象都成功时,新 Promise 对象才会成功;只要任何一个 Promise 对象失败,新 Promise 对象就会失败。
以下是一个手写的 Promise.all() 方法的实现:
```javascript
function promiseAll(promises) {
return new Promise((resolve, reject) => {
let results = new Array(promises.length);
let resolvedCount = 0;
promises.forEach((promise, index) => {
promise.then(result => {
results[index] = result;
resolvedCount++;
if (resolvedCount === promises.length) {
resolve(results);
}
}).catch(error => {
reject(error);
});
});
});
}
```
这个实现中,我们首先创建了一个新的 Promise 对象,并在该 Promise 对象中使用一个数组来存储每个 Promise 对象的结果。我们还定义了一个计数器 resolvedCount,用于跟踪已经解决的 Promise 对象的数量。
然后,我们使用 forEach() 方法遍历传递给 promiseAll() 方法的 Promise 对象数组,并为每个 Promise 对象设置一个 then() 方法来处理成功的情况。在每个成功的 then() 回调函数中,我们将该 Promise 对象的结果存储在结果数组中,并将 resolvedCount 计数器增加 1。如果 resolvedCount 的值等于 Promise 对象的数组的长度,则意味着所有 Promise 对象都已成功解决,我们就可以使用 resolve() 方法来解决新的 Promise 对象,并传递结果数组作为参数。
如果任何一个 Promise 对象失败,则我们使用 catch() 方法处理错误情况,并使用 reject() 方法拒绝新的 Promise 对象。
阅读全文