Promise.all()方法接收的可迭代对象中,如果有一个Promise被拒绝,会发生什么?

简介: Promise.all()方法接收的可迭代对象中,如果有一个Promise被拒绝,会发生什么?

Promise.all() 接收的可迭代对象中有一个 Promise 被拒绝(状态变为 rejected 时,会触发快速失败(fail-fast) 机制,具体表现为:

  1. 立即终止执行
    Promise.all()立刻停止等待其他 Promise,无论其他 promise 是处于 pending(进行中)还是 fulfilled(已成功)状态。

  2. 返回被拒绝的原因
    新生成的 promise 会立即变为 rejected 状态,并将第一个被拒绝的 promise 的错误原因(即 reject() 传递的参数)作为自己的拒绝原因。

  3. 忽略后续结果
    其他未完成的 promise 即使后续变为 fulfilledrejected,也不会影响 Promise.all() 的最终结果(已因第一个错误而终止)。

示例代码

// 三个异步任务:1个失败,2个成功
const p1 = Promise.resolve("成功1");
const p2 = new Promise((resolve, reject) => {
   
  setTimeout(() => reject(new Error("任务2失败")), 500); // 第一个失败
});
const p3 = new Promise((resolve) => {
   
  setTimeout(() => resolve("成功3"), 1000); // 虽然后续会成功,但被忽略
});

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

关键结论

Promise.all() 对错误非常敏感,只要有一个 promise 失败,整个批量操作就会立即失败,且仅返回第一个错误。这一特性要求使用时必须通过 catch() 处理可能的错误,避免未捕获的异常导致程序中断。

如果需要等待所有 promise 完成(无论成功或失败),可使用 Promise.allSettled() 替代,它会返回所有 promise 的结果(包含成功和失败信息)。

目录
相关文章
|
5月前
|
前端开发
Promise.all()方法和Promise.race()方法有什么区别?
Promise.all()方法和Promise.race()方法有什么区别?
440 115
|
5月前
|
前端开发
Promise.all()方法的作用是什么?
Promise.all()方法的作用是什么?
405 121
|
5月前
|
前端开发 JavaScript
Promise.allSettled()方法和Promise.all()方法有什么区别?
Promise.allSettled()方法和Promise.all()方法有什么区别?
420 123
|
5月前
|
自然语言处理 前端开发 JavaScript
js异步
js异步
646 108
|
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生命周期与依赖管理。

热门文章

最新文章