手写Promise.all()
时间: 2023-12-07 12:39:11 浏览: 94
下面是手写Promise.all()的实现代码:
```javascript
function promiseAll(promises) {
return new Promise((resolve, reject) => {
let result = [];
let count = 0;
for (let i = 0; i < promises.length; i++) {
Promise.resolve(promises[i]).then(res => {
result[i] = res; count++;
if (count === promises.length) {
resolve(result);
}
}).catch(err => {
reject(err);
});
}
});
}
```
相关问题
手写Promise.all
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 对象。
手写promise.all
下面是一个简单的手写 Promise.all 实现:
```javascript
function promiseAll(promises) {
return new Promise((resolve, reject) => {
let results = [];
let count = 0;
promises.forEach((promise, index) => {
Promise.resolve(promise).then((result) => {
results[index] = result;
count++;
if (count === promises.length) {
resolve(results);
}
}).catch((error) => {
reject(error);
});
});
});
}
```
这个实现创建了一个新的 Promise,通过遍历 promises 数组,将每个 promise 转为一个 resolved 状态的 promise,并在每个 resolved promise 返回结果时保存结果到 results 数组中。当所有的 promise 都返回结果时,将 results 数组作为 Promise.all 的返回值 resolve。如果其中一个 promise 出现错误,则直接 reject。
阅读全文