面试官:来说一下 promise.all 和 promise.allSettled 的区别

前言

说到 Promise.all,很多人应该不陌生,那 Promise.allSettled,可能很多朋友并没有使用过,这两者有相同部分,也有不同部分,今天就带大家一起来了解一下这两个方法。

Promise.all()

Promise.all() 方法接受一个 Promise 对象的数组作为参数,并返回一个新的 Promise 实例。

该实例会在所有传入的 Promise 实例都完成后 才完成,而且传入的 Promise 实例中只要有一个被拒绝, 则该实例就会立即被拒绝。

它的主要作用是将多个 Promise 实例组合成一个单一的 Promise 实例。

MDN官方解释:

Promise.all() - JavaScript | MDN (mozilla.org)

举例说明:

js 复制代码
const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => resolve('Promise 1 resolved'), 1000);
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => reject('Promise 2 rejected'), 500);
});

const promise3 = new Promise((resolve, reject) => {
  setTimeout(() => resolve('Promise 3 resolved'), 1500);
});

// 使用 Promise.all
Promise.all([promise1, promise2, promise3])
  .then(results => console.log(results))
  .catch(error => console.error(error));
// 输出: Promise 2 rejected

结果如下:

可以看到我们上面写了三个 Promise,promise1 /promise3为成功状态的promise,promise2为拒绝,所以打印结果为失败状态的 promise 。

如果三个都成功,则会输出一个数组,保存成功之后返回的信息。

Promise.allSettled()

Promise.allSettled() 方法也接受一个 Promise 对象的数组作为参数,并返回一个新的 Promise 实例。

该实例会在所有传入的 Promise 实例都完成(无论是 resolved 还是 rejected )后才完成。

它会将每个传入的 Promise 实例的结果收集到一个数组中,数组中每一项是一个对象,对象的 status 表示对应 Promise 实例的状态,value 表示对应 Promise 实例的值,reason 仅当 status 为 "rejected",才存在,promsie 拒绝的原因。

可以看到和 Promise.all 不同的是,返回的是一个数组对象的格式,参数意义如下:

MDN官方解释:

Promise.allSettled() - JavaScript | MDN (mozilla.org)

举例说明:

js 复制代码
  const promise1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve('Promise 1 resolved'), 1000)
  })

  const promise2 = new Promise((resolve, reject) => {
    setTimeout(() => reject('Promise 2 rejected'), 500)
  })

  const promise3 = new Promise((resolve, reject) => {
    setTimeout(() => resolve('Promise 3 resolved'), 1500)
  })

  // 使用 Promise.allSettled
  Promise.allSettled([promise1, promise2, promise3])
    .then((results) => console.log(results))
    .catch((error) => console.error(error))

同上,打印结果如下,可以看到被拒绝的 promise 打印出了 reason

区别

  1. Promise.all() 在其中任何一个 Promise 被拒绝时就会被拒绝,而 Promise.allSettled() 则会在所有 Promise 实例都完成(无论成功还是失败)时才完成。

  2. Promise.all() 返回的是一个数组,数组中的值是传入的 Promise 实例的结果值,而 Promise.allSettled() 返回的是一个数组,数组中的值是对象,每个对象表示对应的 Promise 实例的状态和结果值。

  3. 当你需要获取所有异步操作的结果时,无论是成功还是失败,应该使用 Promise.allSettled()。如果只关心所有操作都成功的情况,可以使用 Promise.all()。

相关推荐
子兮曰4 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万4 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝4 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋4 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
晨米酱4 天前
AGENTS.md:Agent 的上下文策略层
面试·架构·agent
卡布鲁4 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄4 天前
JavaScript 隐式全局变量解析
javascript
彧azz4 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
汉堡大王95274 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端