返回

Promise.all 处理多次 reject/最多 n 次 reject

前端

Promise.all 的基本用法

Promise.all() 函数接收一个包含多个 Promise 的数组作为参数。当所有 Promise 都完成或其中一个 Promise 失败时,Promise.all() 函数将返回一个 Promise。如果所有 Promise 都成功完成,则 Promise.all() 返回一个包含所有 Promise 结果的数组。如果其中一个 Promise 失败,则 Promise.all() 返回一个错误。

const promise1 = Promise.resolve(1);
const promise2 = Promise.reject(new Error('Error'));
const promise3 = Promise.resolve(3);

Promise.all([promise1, promise2, promise3])
  .then(results => {
    console.log(results); // [1, Error, 3]
  })
  .catch(error => {
    console.log(error); // Error: Error
  });

在上面的示例中,promise2 被 reject 了,因此 Promise.all() 返回了一个错误。

如何在 Promise.all 中处理多次 reject

有时,我们需要在 Promise.all() 中处理多次 reject。我们可以使用以下方法:

  1. 使用 try...catch 块:
try {
  const results = await Promise.all([promise1, promise2, promise3]);
  console.log(results); // [1, Error, 3]
} catch (error) {
  console.log(error); // Error: Error
}
  1. 使用 Promise.allSettled():
Promise.allSettled([promise1, promise2, promise3])
  .then(results => {
    results.forEach(result => {
      if (result.status === 'fulfilled') {
        console.log(result.value); // 1, 3
      } else if (result.status === 'rejected') {
        console.log(result.reason); // Error
      }
    });
  });

使用 Promise.allSettled() 可以分别处理每个 Promise 的结果,无论它是成功完成还是失败。

如何仅处理最多 n 次 reject

有时,我们只需要处理最多 n 次 reject。我们可以使用以下方法:

  1. 使用 Promise.any():
Promise.any([promise1, promise2, promise3])
  .then(result => {
    console.log(result); // 1
  })
  .catch(error => {
    console.log(error); // Error
  });

Promise.any() 函数返回第一个完成的 Promise 的结果,无论它是成功完成还是失败。如果所有 Promise 都失败,则 Promise.any() 返回一个错误。

  1. 使用自定义代码:
let rejectCount = 0;
const maxRejectCount = 2;

const promise1 = Promise.resolve(1);
const promise2 = Promise.reject(new Error('Error 1'));
const promise3 = Promise.reject(new Error('Error 2'));

Promise.all([promise1, promise2, promise3])
  .then(results => {
    console.log(results); // [1, Error, Error]
  })
  .catch(error => {
    rejectCount++;

    if (rejectCount <= maxRejectCount) {
      // 处理错误
    } else {
      // 抛出错误
      throw error;
    }
  });

在上面的示例中,我们使用了一个自定义的计数器来跟踪 reject 的次数。当 reject 的次数超过 maxRejectCount 时,我们将抛出错误。

结论

Promise.all() 是一个非常有用的 JavaScript 函数,可以用于处理多个异步请求。在本文中,我们探讨了如何在 Promise.all() 中处理多次 reject,以及如何仅处理最多 n 次 reject。希望这些知识对您有所帮助。