以下为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新引入的一个错误类型,代表了多个错误的聚合体。