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()

目录
相关文章
|
20天前
|
前端开发
Promise.all()方法和Promise.race()方法有什么区别?
Promise.all()方法和Promise.race()方法有什么区别?
319 115
|
20天前
|
前端开发
Promise.allSettled()方法的语法是什么?
Promise.allSettled()方法的语法是什么?
226 117
|
20天前
|
前端开发
Promise.all()方法的作用是什么?
Promise.all()方法的作用是什么?
248 121
|
10天前
|
JSON 监控 API
掌握使用 requests 库发送各种 HTTP 请求和处理 API 响应
本课程全面讲解了使用 Python 的 requests 库进行 API 请求与响应处理,内容涵盖环境搭建、GET 与 POST 请求、参数传递、错误处理、请求头设置及实战项目开发。通过实例教学,学员可掌握基础到高级技巧,并完成天气查询应用等实际项目,适合初学者快速上手网络编程与 API 调用。
244 130
|
13天前
|
Web App开发 JavaScript 前端开发
在使用Foldables.js库时,可能会遇到哪些常见问题及解决方法?
在使用Foldables.js库时,可能会遇到哪些常见问题及解决方法?
244 125
|
2天前
|
缓存 自然语言处理 监控
阿里巴巴 item_review 接口深度分析及 Python 实现
阿里巴巴开放平台的 item_review 接口用于获取商品用户评论数据,支持评论内容、评分、买家信息等多维度分析,助力产品优化与市场策略制定。
|
20天前
|
前端开发
Promise.all()方法接收的可迭代对象中,如果有一个Promise被拒绝,会发生什么?
Promise.all()方法接收的可迭代对象中,如果有一个Promise被拒绝,会发生什么?
209 108
|
12天前
|
JavaScript API 数据安全/隐私保护
Vuex 插件和 Pinia 插件在使用场景上有哪些区别?
Vuex 插件和 Pinia 插件在使用场景上有哪些区别?
256 127
|
20天前
|
自然语言处理 前端开发 JavaScript
js异步
js异步
441 108