返回

Javascript异步转同步篇二——Promise.all/allSettled

前端

Promise.all()方法

Promise.all()方法接受一个Promise数组作为参数,并返回一个新的Promise对象。当所有传入的Promise对象都成功执行后,新的Promise对象才会执行成功,其中任意一个Promise对象执行失败,新的Promise对象也会执行失败。

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);

Promise.all([promise1, promise2, promise3])
  .then((values) => {
    console.log(values); // [1, 2, 3]
  })
  .catch((error) => {
    console.log(error); // 不执行
  });

上面的代码中,三个Promise对象都成功执行,因此Promise.all()方法返回的Promise对象也会执行成功,并将三个Promise对象执行的结果作为参数传递给.then()方法的回调函数。

如果其中任意一个Promise对象执行失败,Promise.all()方法返回的Promise对象也会执行失败,并将第一个执行失败的Promise对象执行的错误信息作为参数传递给.catch()方法的回调函数。

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

Promise.all([promise1, promise2, promise3])
  .then((values) => {
    console.log(values); // 不执行
  })
  .catch((error) => {
    console.log(error.message); // Error
  });

Promise.allSettled()方法

Promise.allSettled()方法与Promise.all()方法类似,但它会等到所有传入的Promise对象都执行完毕后再执行成功,无论这些Promise对象是否执行成功。

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

Promise.allSettled([promise1, promise2, promise3])
  .then((values) => {
    console.log(values); // [{status: "fulfilled", value: 1}, {status: "rejected", reason: Error}, {status: "fulfilled", value: 3}]
  })
  .catch((error) => {
    console.log(error); // 不执行
  });

上面的代码中,三个Promise对象都执行完毕,因此Promise.allSettled()方法返回的Promise对象也会执行成功,并将三个Promise对象执行的结果作为参数传递给.then()方法的回调函数。

其中,promise2执行失败,因此它的结果对象中的status属性值为"rejected",reason属性值为错误信息;其他两个Promise对象执行成功,因此它们的结果对象中的status属性值为"fulfilled",value属性值为执行结果。

总结

Promise.all()方法和Promise.allSettled()方法都是用来处理多个Promise对象同时执行或全部执行完毕后再执行后续操作的。Promise.all()方法要求所有传入的Promise对象都执行成功,而Promise.allSettled()方法则会等到所有传入的Promise对象都执行完毕后再执行成功。