手写一个promise.all
时间: 2023-03-01 11:58:50 浏览: 39
可以使用以下代码手写一个 `Promise.all` 函数:
```
function PromiseAll(promises) {
return new Promise((resolve, reject) => {
if (!Array.isArray(promises)) {
return reject(new TypeError('Promise.all requires an array'));
}
const results = [];
let remaining = promises.length;
function resolver(index) {
return value => {
resolveAll(index, value);
};
}
function rejecter(reason) {
reject(reason);
}
function resolveAll(index, value) {
results[index] = value;
if (--remaining === 0) {
resolve(results);
}
}
for (let i = 0; i < promises.length; i++) {
Promise.resolve(promises[i]).then(resolver(i), rejecter);
}
});
}
```
该函数接受一个包含多个 Promise 实例的数组,并返回一个新的 Promise 实例。如果传入的不是一个数组,则返回一个 reject 状态的 Promise 实例,并将一个 TypeError 作为原因。
如果传入的数组中的所有 Promise 都是 fulfilled 状态,则返回的 Promise 实例也是 fulfilled 状态,并将所有 Promise 的返回值作为一个数组传递给它的回调函数。如果传入的数组中至少有一个 Promise 是 rejected 状态,则返回的 Promise 实例也是 rejected 状态,并将第一个被 reject 的 Promise 的原因作为参数传递给它的回调函数。
你可以像使用标准的 `Promise.all` 函数一样使用这个函数。例如:
```
PromiseAll([promise1, promise2, promise3]).then(values => {
console.log(values); // [value1, value2, value3]
}).catch(reason => {
console.error(reason);
});
```
希望这对你有帮助!
阅读全文