返回

何谓 `Promise.any` 及如何亲力亲为打造?

前端

Promise.any 的作用

Promise.any 是一个用于并行处理一组 Promise 的函数,只要有一个 Promise 成功,就会立即返回该 Promise 的值,并忽略其他 Promise 的结果。如果所有 Promise 都失败,则 Promise.any 将返回一个聚合错误。

Promise.any 的语法如下:

Promise.any(iterable)

其中,iterable 是一个可迭代对象,包含要并行处理的 Promise。

Promise.any 应用场景

Promise.any 可以用于以下场景:

  • 超时处理: 你可以使用 Promise.any 来为一组 Promise 设置超时。如果某个 Promise 在超时时间内成功,则 Promise.any 将立即返回该 Promise 的值。
  • 并发请求: 你可以使用 Promise.any 来并发发送多个请求。当第一个请求成功时,Promise.any 将立即返回该请求的响应。
  • 故障转移: 你可以使用 Promise.any 来实现故障转移。当某个 Promise 失败时,Promise.any 将立即尝试执行另一个 Promise。

Promise.any vs Promise.race

Promise.anyPromise.race 非常相似,但也有两个主要区别:

  • Promise.any 只需要一个 Promise 成功即可,而 Promise.race 需要所有 Promise 都成功。
  • Promise.any 会忽略失败的 Promise,而 Promise.race 会将失败的 Promise 的错误聚合起来。

如何自己实现 Promise.any

如果你使用的是不支持 Promise.any 的 JavaScript 环境,你可以自己实现一个 Promise.any 函数。以下是如何实现 Promise.any 的步骤:

  1. 创建一个新的 Promise。
  2. 将可迭代对象中的每个 Promise 添加到一个数组中。
  3. 使用 Promise.all 函数来并行处理数组中的所有 Promise。
  4. 当任何一个 Promise 成功时,立即返回该 Promise 的值。
  5. 如果所有 Promise 都失败,则返回一个聚合错误。

以下是 Promise.any 的实现代码:

function promiseAny(iterable) {
  return new Promise((resolve, reject) => {
    const promises = [];
    for (const promise of iterable) {
      promises.push(promise);
    }

    Promise.all(promises).then((results) => {
      for (const result of results) {
        if (result !== undefined) {
          resolve(result);
          return;
        }
      }

      reject(new Error('All promises failed'));
    });
  });
}

总结

Promise.any 是一个非常有用的工具,可以用于并行处理一组 Promise。它可以用于超时处理、并发请求和故障转移等场景。如果你使用的是不支持 Promise.any 的 JavaScript 环境,你可以使用本文提供的代码自己实现一个 Promise.any 函数。