前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库Promise.all 快速失败
JSJavaScript异步与 Promise

Promise.all 在其中一个 Promise 被拒绝时,会立即拒绝吗?其他 Promise 的结果如何处理?

会。Promise.all 在任一输入 Promise 被拒绝时立即以该原因拒绝,其他 Promise 仍继续执行,但结果会被忽略。

前端进阶之旅 · 一题精讲更新于 2026.09.05
JavaScript#异步与 Promise#异步编程
先看核心答案
理解线索

快速失败与结果丢弃

  1. 任一拒绝即整体拒绝第一个被拒绝的 Promise 的原因成为整体拒绝原因
  2. 其余 Promise 不受影响执行继续但结果不再被 Promise.all 使用
  3. 内部处理标记避免告警Promise.all 调用时已为它们附加 then 处理

注意:Promise.all([]) 直接 fulfilled,并非拒绝。

核心回答

先记住这个答案

Promise.all 采用快速失败策略:只要输入数组中的任何一个 Promise 转为 rejected,返回的 Promise 就立即以相同的 rejection reason 拒绝,而无须等待其他 Promise。其他未决的 Promise 并不会被取消或停止,它们会继续执行自己的异步操作,只是最终结果(无论成功或失败)不会再影响外层 Promise,且由于 Promise.all 内部已为每个输入附加了处理函数,后续的拒绝也不会触发 unhandledrejection。

  • 任一输入拒绝即整体快速拒绝
  • 其他 Promise 继续执行但结果被忽略
  • 后续拒绝不会触发 unhandledrejection

拒绝传播的微任务时机

Promise.all 在内部对每个输入 Promise 调用 then,并登记计数。当某个 Promise 转为 rejected 时,它会立即调用外层 Promise 的拒绝分支,使返回值立刻拒绝。这里的“立刻”是微任务层面上的,不等待同批其他 Promise 的完成。

其他 Promise 不会被取消,因为它们已经启动了自己的异步流程。当它们之后成功或失败时,Promise.all 的内部处理器已设置为忽略其结果,因此不会覆盖已经确定的拒绝状态。同时这些处理器使每个 Promise 都被视为“已处理”,所以之后出现的 rejection 不会冒泡为 unhandledrejection。

并行拉取接口:一个 401 触发整体跳转登录

一个页面需要同时请求用户资料、好友列表和设置项,三个请求互不依赖,用 Promise.all 并发发起。若好友列表接口因会话过期返回 401,Promise.all 会立刻进入 rejected 状态,进入 catch 分支提示用户重新登录,而不等待另外两个可能几秒后才返回的请求。

此时另外两个请求的网络传输仍在进行,服务器也会正常响应,但它们的返回值不再被使用。如果后续它们自身也失败,不会触发任何错误事件,因为 Promise.all 已经给它们加了处理函数。要保留部分成功数据,应给每个子 Promise 单独附加 catch 转换成默认值,但这会改变快速失败语义。

快速失败不等于取消,也不适合需要完整结果的场合

快速失败是一种短路机制,但 Promise 本身没有取消能力。如果发起的是 HTTP 请求,请求会继续占用连接直到响应或超时。若后续逻辑依赖所有请求都完成(例如统计、日志聚合),用 Promise.all 会导致流式结果丢失,此时应改用 allSettled 等待全部落定。

另一个边界:Promise.all 接受可迭代对象但不接受函数,如果直接把 async 函数作为元素传入,它们不会执行,返回值是函数本身。遇到混合场景时,应优先保证每个子任务都能处理自身拒绝,再决定用哪个组合器。

回答前,多想一步

容易答错的地方

其他 Promise 会被取消或停止
错。Promise.all 拒绝不会取消任何子 Promise,它们已经启动的异步操作会继续执行,只是结果被忽略。要真正取消需使用 AbortController 等机制,这不在 Promise.all 的能力范围内。
后续拒绝会触发 unhandledrejection
错。Promise.all 在调用时已为每个输入 Promise 附加了 .then,因此所有 Promise 都被视为“已处理”。即使首个拒绝之后,其他 Promise 又拒绝,也不会触发全局的 unhandledrejection 事件。
试着用自己的话回答

面试官还会怎么问?

Promise.all 和 Promise.allSettled 在错误处理上的核心区别是什么?

Promise.all 任一拒绝就立即以该原因整体拒绝,忽略后续结果;allSettled 等待所有输入完成,每个结果无论成功或失败都会被汇总成数组,始终不会提前拒绝。

如何让 Promise.all 中某个失败不影响整体,但保留其他成功结果?

为每个子 Promise 附加 .catch,把错误转换成一个标识值或默认值,使它们永不拒绝。这样 Promise.all 只会等到所有子 Promise 都 fulfilled,结果数组可区分成功项与失败项。

Promise.all 返回的 Promise 在输入全部已拒绝时会同步拒绝吗?

不会。Promise.all 的处理始终是异步的(除非传入空数组)。即使所有输入都是已拒绝的 Promise,返回的 Promise 也要等到当前微任务队列中才能被观察,不会同步进入 rejected 状态。

从一道题,走向一组知识

把知识连起来

异步与 Promise

Promise.all 的输入数组中如果存在非 Promise 值,会如何处理?

同属「异步与 Promise」专题,接着看 Promise.all 非 Promise 值 在具体场景中的处理方式。

异步与 Promise

Promise 构造器中的 executor 是同步执行还是异步执行?

同属「异步与 Promise」专题,接着看 Promise executor 同步执行 在具体场景中的处理方式。

放回知识体系中复习JavaScript 进阶知识

参考资料

  • Promise.all()

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 拒绝传播的微任务时机
  3. 并行拉取接口:一个 401 触发整体跳转登录
  4. 快速失败不等于取消,也不适合需要完整结果的场合
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑