Promise.allSettled()方法和Promise.all()方法有什么区别?

简介: Promise.allSettled()方法和Promise.all()方法有什么区别?

Promise.allSettled()Promise.all() 都是用于处理多个并行异步任务的静态方法,但它们对异步结果的处理逻辑有本质区别,核心差异在于“是否等待所有任务完成”和“如何处理失败任务”。

一、核心区别对比

特性 Promise.all(iterable) Promise.allSettled(iterable)
成功条件 所有 Promise 都必须变为 fulfilled(全成功) 无需等待所有成功,只要所有 Promise 都有结果(无论成功或失败)
返回结果 返回所有成功结果的数组(按传入顺序) 返回所有任务的“结果对象”数组,每个对象包含任务状态和值
失败处理 只要有一个 Promise 失败,立即返回该错误(快速失败) 不会因任何任务失败而触发 catch,始终等待所有任务完成
结果对象结构 直接返回原始成功值(如 [1, 2, 3] 每个结果是对象:
- 成功:{ status: "fulfilled", value: 结果 }
- 失败:{ status: "rejected", reason: 错误 }

二、代码示例对比

1. Promise.all():快速失败(一败全败)

const p1 = Promise.resolve(100);
const p2 = Promise.reject(new Error("任务2失败"));
const p3 = Promise.resolve(300);

Promise.all([p1, p2, p3])
  .then(results => {
   
    console.log("所有成功:", results); // 不会执行(因p2失败)
  })
  .catch(error => {
   
    console.error("捕获错误:", error.message); // 输出:"任务2失败"
  });

2. Promise.allSettled():等待所有结果(无论成败)

const p1 = Promise.resolve(100);
const p2 = Promise.reject(new Error("任务2失败"));
const p3 = Promise.resolve(300);

Promise.allSettled([p1, p2, p3])
  .then(results => {
   
    console.log("所有任务结果:", results);
    /* 输出结果:
    [
      { status: "fulfilled", value: 100 },
      { status: "rejected", reason: Error: 任务2失败 },
      { status: "fulfilled", value: 300 }
    ]
    */
  })
  .catch(error => {
   
    console.error("捕获错误:", error); // 永远不会执行
  });

三、适用场景

  • Promise.all()
    适合所有任务必须全部成功的场景,例如:

    • 提交表单前,需验证多个字段的接口(所有验证通过才能提交);
    • 加载页面所需的关键资源(如 CSS、JS、接口数据),缺一不可。
  • Promise.allSettled()
    适合需要知道所有任务的执行结果(无论成败) 的场景,例如:

    • 批量操作反馈(如批量发送邮件,需统计成功/失败数量);
    • 从多个数据源获取数据(部分源失败不影响其他源的结果处理)。

总结

  • Promise.all() 是“全有或全无”:所有成功才返回结果,一个失败则整体失败。
  • Promise.allSettled() 是“等待所有结束”:无论成功失败,都会返回所有任务的详细结果,适合需要完整统计的场景。

选择时需根据业务是否能容忍部分任务失败来决定:若缺一不可用 all(),若需完整结果用 allSettled()

目录
相关文章
|
5月前
|
前端开发
Promise.all()方法和Promise.race()方法有什么区别?
Promise.all()方法和Promise.race()方法有什么区别?
440 115
|
5月前
|
前端开发
Promise.all()方法接收的可迭代对象中,如果有一个Promise被拒绝,会发生什么?
Promise.all()方法接收的可迭代对象中,如果有一个Promise被拒绝,会发生什么?
298 108
|
5月前
|
自然语言处理 前端开发 JavaScript
js异步
js异步
646 108
|
5月前
|
前端开发
Promise.all()方法的作用是什么?
Promise.all()方法的作用是什么?
405 121
|
NoSQL 数据可视化 关系型数据库
推荐几个好用的redis可视化工具
推荐几个好用的redis可视化工具
18187 1
|
5月前
|
安全 网络协议 网络安全
Palo Alto PAN-OS 12.1 Orion 新增功能简介
Palo Alto PAN-OS 12.1 Orion 发布 - 请访基于机器学习的下一代防火墙操作系统
271 1
Palo Alto PAN-OS 12.1 Orion 新增功能简介
|
5月前
|
XML JSON 数据库
大模型不听话?试试提示词微调
想象一下,你向大型语言模型抛出问题,满心期待精准回答,得到的却是答非所问,是不是让人抓狂?在复杂分类场景下,这种“大模型不听话”的情况更是常见。
336 9
|
5月前
|
缓存 Java Spring
Spring循环依赖:当两个Bean陷入鸡生蛋死循环时...
Spring中循环依赖问题常见于Bean相互依赖时,尤其在单例模式下。文章深入解析了循环依赖的成因及Spring的三级缓存解决方案,帮助理解Bean生命周期与依赖管理。

热门文章

最新文章