Promise.all 只要有一个 Promise 对象失败就会失败,如何改造

239 阅读1分钟

如果 Promise.all 中有一个 Promise 对象失败,那么整个 Promise.all 就会失败。如果需要让 Promise.all 在某个 Promise 对象失败的情况下仍然可以成功运行,可以使用 Promise.allSettled 方法。 Promise.allSettled 方法会等待所有 Promise 对象完成,无论是成功还是失败,它都会返回一个数组,包含了每个 Promise 对象的结果。如果 Promise 对象成功,那么结果会是 { status: 'fulfilled', value: 成功的结果 },如果 Promise 对象失败,那么结果会是 { status: 'rejected', reason: 失败的原因 }。 下面是一个使用 Promise.allSettled 方法的示例代码:

javascriptCopy code
function wait(time) {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      if (time < 1500) {
        reject('等待时间太短');
      } else {
        resolve('等待了 ' + time + ' 毫秒');
      }
    }, time);
  });
}
async function test() {
  try {
    let results = await Promise.allSettled([wait(2000), wait(1000), wait(1500)]);
    results.forEach(result => {
      if (result.status === 'fulfilled') {
        console.log(result.value); // 输出成功的结果
      } else {
        console.log(result.reason); // 输出失败的原因
      }
    });
  } catch (error) {
    console.log(error);
  }
}
test();

在上面的代码中,我们使用 Promise.allSettled 方法等待所有 Promise 对象完成,然后遍历结果数组,根据每个 Promise 对象的状态输出相应的结果。这样即使有 Promise 对象失败,整个 Promise.allSettled 仍然可以成功运行。