promise.all 如何处理错误阻碍下面程序执行(高并发)

316 阅读2分钟

在使用 Promise.all() 时,如果其中一个 promise 被拒绝(rejected)了,整个操作就会被中止,并抛出一个异常。因此,为了处理错误,可以通过将每个 promise 包含在 try/catch 块中来捕获异常并处理它们。

以下是一个示例代码,其中我们假设有三个 promise 对象 P1、P2 和 P3,我们将这些对象传递给 Promise.all() 方法。如果 P1 被拒绝,那么我们需要捕获异常并记录错误信息,然后继续执行 P2 和 P3 的操作。

javascript复制代码
Promise.all([P1, P2, P3])
  .then((results) => {
    console.log(results);
  })
  .catch((error) => {
    console.error(error);
    // 继续执行 P2 和 P3 的操作
  });

另一种方法是使用 Promise.allSettled() 方法,它不会因为某个 promise 被拒绝而中止操作,而是等待所有 promise 都完成或被拒绝后返回一个数组。无论 promise 是否被解决,都会将结果放入数组中,并提供有关每个 promise 的信息。

以下是一个示例代码:

javascript复制代码
Promise.allSettled([P1, P2, P3])
  .then((results) => {
    results.forEach((result) => {
      if (result.status === "fulfilled") {
        console.log("Result:", result.value);
      } else {
        console.error("Error:", result.reason);
      }
    });
  })
  .catch((error) => {
    console.error(error);
  });

在该示例中,Promise.allSettled() 返回的结果是一个包含每个 promise 的状态和结果的数组。我们可以使用 forEach() 循环遍历结果并根据其状态输出结果或错误信息。

在高并发场景下,处理Promise的错误和中断执行都是非常重要的问题。以下是一些常见的解决方案:

  1. Promise.allSettled():

可以使用Promise.allSettled()方法来处理多个Promise对象并行执行过程中产生的错误,该方法接收一个Promise数组作为参数,并返回一个新的Promise对象,当所有Promise对象都被解决时才会resolve结果数组,即使其中某个Promise对象处于rejected状态也不会影响其他Promise对象的执行。我们可以在then回调函数中遍历结果数组,检查每个Promise对象的状态以及错误信息,然后进行相应的处理。

复制代码
const promises = [promise1, promise2, promise3];

Promise.allSettled(promises)
  .then(results => {
    results.forEach(result => {
      if (result.status === "fulfilled") {
        console.log(result.value);
      } else {
        console.error(result.reason);
      }
    });
  })
  .catch(error => {
    console.error(error);
  });
  1. Promise.race():

如果希望在多个Promise对象同时执行时,只要有一个Promise对象的状态发生改变就中断执行,可以使用Promise.race()方法,该方法接收一个Promise数组作为参数,并返回一个新的Promise对象,当其中任何一个Promise对象被解决或拒绝时,就会将其对应的值或原因传递给返回的Promise对象的回调函数。我们可以在then回调函数中检查Promise对象的状态以及返回值,然后进行相应的处理。

复制代码
const promises = [promise1, promise2, promise3];

Promise.race(promises)
  .then(result => {
    console.log(result);
  })
  .catch(error => {
    console.error(error);
  });

以上是一些处理Promise高并发场景下错误和中断执行的解决方案,开发者可以根据具体情况选择合适的方法。