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() 可以轻松实现该功能。
function getData(urls) { const promises = urls.map(url => fetch(url)); return Promise.any(promises) .then(response => response.json()) .catch(error => console.error(error)); }
在上面的代码中,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