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 的结果(包含成功和失败信息)。

目录
相关文章
|
10月前
|
前端开发
Promise.all()方法和Promise.race()方法有什么区别?
Promise.all()方法和Promise.race()方法有什么区别?
671 115
|
10月前
|
前端开发
Promise.all()方法的作用是什么?
Promise.all()方法的作用是什么?
700 121
|
10月前
|
自然语言处理 前端开发 JavaScript
js异步
js异步
805 108
|
10月前
|
前端开发 JavaScript
Promise.allSettled()方法和Promise.all()方法有什么区别?
Promise.allSettled()方法和Promise.all()方法有什么区别?
602 123
|
10月前
|
前端开发
Promise.allSettled()方法的语法是什么?
Promise.allSettled()方法的语法是什么?
490 117
|
10月前
|
安全 网络协议 网络安全
Palo Alto PAN-OS 12.1 Orion 新增功能简介
Palo Alto PAN-OS 12.1 Orion 发布 - 请访基于机器学习的下一代防火墙操作系统
569 1
Palo Alto PAN-OS 12.1 Orion 新增功能简介
|
10月前
|
开发工具 git
解决 VSCode 安装通义灵码后左侧菜单栏不显示按钮的问题
在 VSCode 中安装通义灵码插件后,若左侧活动栏未显示图标,可通过右键选中代码触发插件面板,并将其图标拖至左侧栏固定,便于后续快速使用。
4825 116