以下为ChatGPT自动生成的解答,正确与否请自行判断。
BFE.devAI解答 - JavaScript 代码题
34. 实现`Promise.any()`
Promise.any = function (promises) {
return new Promise((resolve, reject) => {
let errors = [];
for (let promise of promises) {
Promise.resolve(promise).then(resolve).catch((error) => errors.push(error));
}
if (errors.length === promises.length) {
reject(new AggregateError('No Promise in Promise.any was resolved', errors));
}
});
};
我们先定义一个全局函数Promise.any()
,它接收一个Promise可迭代器。然后我们返回一个新的Promise实例,里面包含了我们的业务逻辑。
在新的Promise实例里,我们使用了一个let errors
空数组,当任何一个Promise成功被解析时,我们就将它的结果作为参数传入新的Promise实例中的resolve
函数中,并终止迭代。
但是,如果所有的Promise都出现了拒绝,那么我们就会在catch
块中捕捉到异常,我们将每个Promise的异常都放入errors
数组中。如果errors
的长度等于迭代器的最大长度,那么就表示所有的Promise都出现了拒绝,这个Promise.any()实例也应该拒绝,并且将errors
数组作为第二个参数一同传入一个AggregateError
实例中。
附注:AggregateError
是ES2020新引入的一个错误类型,代表了多个错误的聚合体。