Promise.any() 是 ECMAScript 2021(ES12) 中新增的方法,它将多个 Promise 实例包装成一个新的 Promise 实例,只要其中一个 Promise 实例状态变为 resolved 或 fulfilled,就立即返回该 Promise 实例,而不必等到所有 Promise 实例都已完成。
这个方法对于解决多个异步任务的时候非常有用,尤其是当我们只需要其中一个异步任务完成而无需等待其他任务时,能够大大提升程序的执行效率。
语法
Promise.any(iterable)
参数
iterable: 一个可迭代的对象,由多个 Promise 实例构成。若 iterable 为空,Promise.any() 将返回一个被拒绝(rejected)状态的 Promise 实例,该实例包含一个 AggregateError 对象,表示所有 Promise 实例的错误信息。
返回值
返回完成(resolved)状态的 Promise 实例,如果所有 Promise 实例都被拒绝(rejected),Promise.any()将返回一个被拒绝状态的 Promise 实例,该实例包含一个 AggregateError 对象,表示传入的所有错误信息。
示例
下面是一个使用 Promise.any() 的示例:
-- -------------------- ---- ------- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------------- ---- -- ------ --- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------------- ---- -- ------ --- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------------- ---- -- ------ --- ---------------------- --------- ---------- -------------- -- - -------------------- -- --- -------- -- ---
在上面的示例中,我们创建了三个 Promise 实例,分别尝试在 2000 毫秒,1500 毫秒和 1000 毫秒内完成。
我们使用 Promise.any() 将这些 Promise 实例包装在一个新的 Promise 实例中,并且只要其中一个 Promise 实例状态变为 resolved,就会立即返回该 Promise 实例。
在这个例子中,第三个 Promise 实例是最快的,所以 Promise.any() 会立即返回一个已完成的 Promise 实例,并输出 "Promise 3"。
AggregateError 对象
如果 iterable 为空,Promise.any() 将返回一个被拒绝状态的 Promise 实例,该实例包含一个 AggregateError 对象,表示所有 Promise 实例的错误信息。AggregateError 对象是 ECMAScript2020(ES11) 中新增的错误类型,表示多个错误的集成。它的语法如下:
new AggregateError(errors)
参数:
errors: 一个可迭代的对象,由多个 Error 对象构成。
下面是一个使用 Promise.any() 处理错误的示例:
-- -------------------- ---- ------- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------- -------------- - --------- -- ------ --- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------- -------------- - --------- -- ------ --- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------- -------------- - --------- -- ------ --- ---------------------- --------- ---------- -------------- -- - -------------------- -- -------------- -- - ----------------- ---------- ---------------- -- --- ---- ------------------- -- --- --------------- --- -------- -------- -------------------------- -- --- ------ ------- - ------ ------ ------- - ------ ------ ------- - ----- ---
在上面的示例中,我们仍然使用了三个 Promise 实例,但是这次每个 Promise 实例都被拒绝了。
由于 iterable 不可能为空,因此 Promise.any() 会返回一个被拒绝状态的 Promise 实例,并包含一个 AggregateError 对象,该对象表示该 iterable 中的所有错误信息。
总结
Promise.any() 是 ECMAScript 2021(ES12) 中新增的方法,它非常适用于解决多个异步任务的场景,特别是当我们只需要其中一个异步任务完成而无需等待其他任务时。在使用时,我们需要将所有的 Promise 实例放在一个数组中,而不是使用单独的 then()、catch() 方法。
AggregateError 对象是 ECMAScript 2020(ES11) 中新增的错误类型,它可以表示多个错误的集成。如果 iterable 中的所有 Promise 实例都被拒绝了,Promise.any() 会返回一个被拒绝的 Promise 实例,并包含一个 AggregateError 对象,该对象包含 iterable 中所有的错误信息。
我们可以通过学习 Promise.any() 方法来提升自己的异步编程技能,更好地解决实际应用中的问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64fd322e95b1f8cacdcc5240