返回

Promise面试必备:手写Promise.all和Promise.allSettled方法

前端

前言

Promise是一种异步编程模型,它使开发人员能够更加容易地处理异步操作。Promise.all和Promise.allSettled是Promise常用的两个静态方法,用于处理异步并发请求。

Promise.all

Promise.all方法接收一个Promise数组作为参数,并返回一个新的Promise。该Promise将在所有传入的Promise都解析或拒绝后解析或拒绝。如果所有的Promise都解析了,则返回的Promise将解析为一个包含所有Promise解析值的新数组。如果任何一个Promise被拒绝,则返回的Promise将被拒绝,并以第一个被拒绝的Promise的拒绝原因作为拒绝原因。

Promise.all([
  Promise.resolve(1),
  Promise.resolve(2),
  Promise.resolve(3)
]).then((values) => {
  console.log(values); // [1, 2, 3]
});

Promise.all([
  Promise.resolve(1),
  Promise.reject(2),
  Promise.resolve(3)
]).catch((error) => {
  console.log(error); // 2
});

Promise.allSettled

Promise.allSettled方法接收一个Promise数组作为参数,并返回一个新的Promise。该Promise将在所有传入的Promise都解析或拒绝后解析。与Promise.all不同的是,Promise.allSettled将返回一个包含所有Promise解析值或拒绝原因的新数组,无论Promise是解析还是拒绝。

Promise.allSettled([
  Promise.resolve(1),
  Promise.reject(2),
  Promise.resolve(3)
]).then((results) => {
  console.log(results);
  // [
  //   { status: 'fulfilled', value: 1 },
  //   { status: 'rejected', reason: 2 },
  //   { status: 'fulfilled', value: 3 }
  // ]
});

总结

Promise.all和Promise.allSettled是Promise常用的两个静态方法,用于处理异步并发请求。Promise.all方法返回一个新的Promise,该Promise将在所有传入的Promise都解析或拒绝后解析或拒绝。如果所有的Promise都解析了,则返回的Promise将解析为一个包含所有Promise解析值的新数组。如果任何一个Promise被拒绝,则返回的Promise将被拒绝,并以第一个被拒绝的Promise的拒绝原因作为拒绝原因。Promise.allSettled方法也返回一个新的Promise,该Promise将在所有传入的Promise都解析或拒绝后解析。与Promise.all不同的是,Promise.allSettled将返回一个包含所有Promise解析值或拒绝原因的新数组,无论Promise是解析还是拒绝。

在面试中,手写Promise.all和Promise.allSettled方法是一个常见的考题。掌握这两个方法的实现原理和使用方法,可以让你在面试中脱颖而出。