ES12 中的 Promise.any() 解决 JavaScript 异步编程中的问题

阅读时长 5 分钟读完

Promise.any() 是 ES12 中的新特性,它能够在多个 Promise 对象中返回最先执行成功的结果,从而解决 JavaScript 异步编程中的问题。

问题背景

在 JavaScript 异步编程中,经常会遇到以下问题:

  • 多个异步任务并行执行,但需要等待所有任务完成才能对结果进行处理;
  • 多个异步任务并行执行,但只需要其中一个任务的结果并将其返回,而取消其他任务的执行。

在过去,通常使用 Promise.all() 或 Promise.race() 来解决这些问题。但它们都有一些限制:

  • Promise.all() 只有在所有异步任务都执行成功后,才会返回所有结果;
  • Promise.race() 只有在第一个异步任务执行成功后,才会返回一个结果,而无法取消其他任务的执行。

在实际开发中,这些限制可能导致我们无法实现更复杂的异步编程逻辑。因此 ES12 引入了 Promise.any() 来扩展 Promise API。

Promise.any() 的使用

Promise.any() 的用法与 Promise.all() 和 Promise.race() 类似,需要将多个 Promise 对象作为参数传入。该方法返回一个 Promise 对象,它会在传入的 Promise 对象中,只要有一个 Promise 对象执行成功,就返回该 Promise 对象的结果。

下面是 Promise.any() 的示例代码:

-- -------------------- ---- -------
----- -------- - -
  ------------------
  -------------------
  -----------------
--

---------------------
  ------------ -- --------------------
  ------------ -- ----------------------

在上面的代码中,Promise.any() 接收了一个数组 promises,其中包含三个 Promise 对象。其中第一个和第三个 Promise 对象都是执行失败的,只有第二个 Promise 对象执行成功。因此,Promise.any() 返回的结果是 1。

需要注意的是,如果传入的所有 Promise 对象都执行失败,那么 Promise.any() 将会抛出一个 AggregateError 异常。可以通过 catch() 方法来捕捉该异常,如上面的示例代码所示。

实战应用

Promise.any() 可以应用于多个场景,下面将介绍其中两个。

场景1:多个请求并行,但只需要获取一个成功的请求结果并返回

在实际开发中,可能会有多个异步请求需要并行执行,但只需要获取其中任何一个请求的结果,并返回给调用方。此时,使用 Promise.any() 可以轻松实现该功能。

在上面的代码中,getData() 函数接收一个 urls 数组作为参数,其中包含多个请求地址。将每个地址转换为 Promise 对象,并存储在 promises 数组中。使用 Promise.any() 返回最先成功执行的 Promise 对象对应的结果,然后将其转换为 JSON 格式。如果所有 Promise 对象执行失败,则返回错误信息。

场景2:多个请求并行,但需要等待所有请求结束才能处理结果

另一种场景是多个异步请求并行执行,但需要等待所有请求都执行完成后,才能对结果进行处理。此时,Promise.any() 无法满足需求。不过,可以通过 Promise.allSettled() 来实现该功能。

-- -------------------- ---- -------
-------- ------------- -
  ----- -------- - ------------ -- ------------
  ------ ----------------------------
            ------------- -- -
              ----- ----------------- - -------
                -------------- -- ------------- --- ------------
                ----------- -- ---------------------

              ------ ------------------------------
                ---------- -- -----
                ------------ -- ----------------------
            --
            ------------ -- ----------------------
-

在上面的代码中,getData() 函数接收一个 urls 数组作为参数,其中包含多个请求地址。将每个地址转换为 Promise 对象,并存储在 promises 数组中。使用 Promise.allSettled() 等待所有 Promise 对象执行完毕,然后获取所有非失败的 Promise 对象,并将它们的结果转换为 JSON 格式。最后,使用 Promise.all() 等待所有 Promise 对象将它们的结果转换为数据数组,并返回给调用方。如果所有 Promise 对象执行失败,则返回错误信息。

总结

Promise.any() 是 ES12 中新增的 Promise API,它能够在多个 Promise 对象中返回最先执行成功的结果,从而扩展了异步编程的应用场景。与 Promise.all() 和 Promise.race() 相比,Promise.any() 更加灵活,能够满足更多的实际需求。在实际开发中,可以通过 Promise.any() 来简化代码、提高性能,从而提高开发效率和产品质量。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6458b9a7968c7c53b0b0aa3b

纠错
反馈