以下为ChatGPT自动生成的解答,正确与否请自行判断。 也许你也可以从大家的发帖中找到想要的答案!
BFE.devAI解答 - JavaScript 代码题
32. 实现`Promise.all()`
可以使用以下代码实现自己的Promise.all()
:
function PromiseAll(promises) {
return new Promise(function(resolve, reject) {
let results = [];
let count = 0;
promises.forEach(function(p, i) {
Promise.resolve(p).then(function(res) {
results[i] = res;
count++;
if (count === promises.length) {
resolve(results);
}
}).catch(function(err) {
reject(err);
});
});
});
}
使用方法如下:
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);
PromiseAll([promise1, promise2, promise3])
.then(function(results) {
console.log(results); // [1, 2, 3]
}).catch(function(err) {
console.error(err);
});
这个实现中,我们创建了一个新的Promise
。我们迭代给定的promises
数组,并使用Promise.resolve()
方法将每个值都包装成一个Promise
对象。如果传入的参数不是具有 Promise
解析规则的对象,则Promise.resolve(value)
将返回一个状态设置为已解决(resolved)并且其值为value
的 Promise
对象。 所以这样可以确保参数一定是一个Promise
对象。
在每个Promise
对象解决之后,我们将结果存储到results
数组中,并增加count
变量以跟踪已解决的Promise
对象的数量。如果count
等于promises
数组的长度,则说明所有的Promise
对象都已经解决,我们通过调用resolve()
方法并传入results
数组来解决新的Promise
对象。
如果有一个Promise
对象被拒绝了,则我们通过调用reject()
方法并传递拒绝的原因来拒绝新的Promise
对象。
这个实现和Promise.all()
函数有一些细微的差别,例如在结果数组中,如果原始数组中的项为非Promise
类型,则结果数组的值与原数组的值相同。在Promise.all()
中,如果原始数组中的项不是Promise
类型,则会自动转换为解决的Promise
对象,而在我们的实现中则不会。
但是,这个实现的核心思想与Promise.all()
相同,都使用异步操作并在所有Promise
对象解决时进行回调。