帮我手写一个promise.all
时间: 2023-10-18 07:17:04 浏览: 92
手写Promise源码
当然,我非常愿意帮助你手写一个 Promise.all() 函数。
首先,我们需要了解 Promise.all() 函数的作用。它可以接受多个 Promise 对象作为参数,并在这些 Promise 对象都被 fulfilled(已完成)时才返回一个 resolved(已解决)状态的 Promise 对象,如果其中任何一个 Promise 被 rejected(已拒绝),则该 Promise 返回的状态也为 rejected(已拒绝)。
现在,让我们手写一个简单的 Promise.all() 函数:
```javascript
function promiseAll(promises) {
return new Promise(function(resolve, reject) {
if (!Array.isArray(promises)) {
return reject(new TypeError('参数必须为数组'));
}
var resolvedCounter = 0;
var promiseNum = promises.length;
var resolvedValues = new Array(promiseNum);
for (var i = 0; i < promiseNum; i++) {
(function(i) {
Promise.resolve(promises[i]).then(function(value) {
resolvedCounter++;
resolvedValues[i] = value;
if (resolvedCounter == promiseNum) {
return resolve(resolvedValues);
}
}).catch(function(reason) {
return reject(reason);
});
})(i);
}
});
}
```
在这个函数中,我们首先检查传递的参数是否为数组。如果不是,则返回一个 rejected(已拒绝)状态的 Promise 对象,并抛出一个类型错误。然后,我们使用一个 for 循环迭代数组中的所有 Promise 对象。由于对于每个 Promise 对象都需要进行异步操作,因此我们使用了一个自执行函数,并传递 i 作为参数。这样可以确保每个 Promise 对象都在自己的闭包中执行,而不是在全局作用域中执行。
接下来,我们使用 Promise.resolve() 将 promise 对象转换为 Promise 对象。然后,我们分别使用 then() 和 catch() 方法处理 resolved 和 rejected 状态。
在 then() 方法中,我们将该 Promise 的 resolved 值存储在 resolvedValues 数组中,并检查是否已解决了所有 Promise 对象。如果是,则返回一个 resolved(已解决)状态的 Promise 对象,并传递解析的值。如果所有 Promise 对象都已解决,则 resolvedValues 数组包含所有解决方案,而 resolvedCounter 等于 promiseNum。
在 catch() 方法中,我们直接返回一个 rejected(已拒绝)状态的 Promise 对象,并传递 rejection 原因。
现在,您已经了解了如何手写一个 Promise.all() 函数。祝你好运!
阅读全文