Promise 的 all() 方法,说一下自己实现的思路。
时间: 2023-11-16 14:15:27 浏览: 36
`Promise.all()` 方法可以接收一个 Promise 实例数组,返回一个新的 Promise 实例,等待所有 Promise 实例都执行完成后才会返回。如果其中有任意一个 Promise 实例被拒绝(rejected),则整个 Promise 实例都会被拒绝,返回第一个被拒绝的 Promise 实例的错误信息。
下面是自己实现 `Promise.all()` 方法的思路:
1. 判断参数是否为数组,如果不是则抛出异常并返回一个拒绝(rejected)状态的 Promise 实例。
2. 创建一个空数组 `result` 存储每个 Promise 实例的结果,创建一个计数器 `count` 表示已完成的 Promise 实例数量。
3. 遍历每个 Promise 实例,对每个实例调用 `Promise.resolve()` 方法转换成 Promise 实例,并添加 `then` 方法,处理 Promise 实例的结果。
4. 在 `then` 方法中将该 Promise 实例的结果存入 `result` 数组中,如果所有 Promise 实例都已完成,则返回一个已完成(resolved)状态的 Promise 实例,结果为 `result` 数组。
5. 在 `catch` 方法中将该 Promise 实例的错误信息传递到返回的 Promise 实例中,如果有任意一个 Promise 实例被拒绝,则整个 Promise 实例都会被拒绝,返回第一个被拒绝的 Promise 实例的错误信息。
下面是一个简单的示例代码:
```javascript
function myPromiseAll(promises) {
if (!Array.isArray(promises)) {
return Promise.reject(new TypeError('promises must be an array'));
}
const result = [];
let count = 0;
return new Promise((resolve, reject) => {
promises.forEach((promise, index) => {
Promise.resolve(promise).then((value) => {
result[index] = value;
count++;
if (count === promises.length) {
resolve(result);
}
}).catch((error) => {
reject(error);
});
});
});
}
const promise1 = Promise.resolve(1);
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(2);
}, 1000);
});
const promise3 = Promise.reject(new Error('error'));
myPromiseAll([promise1, promise2]).then((result) => {
console.log(result); // 输出:[1, 2]
}).catch((error) => {
console.error(error);
});
myPromiseAll([promise1, promise3]).then((result) => {
console.log(result);
}).catch((error) => {
console.error(error); // 输出:Error: error
});
```