promise通过all、allsettled、race、any等方法协调异步操作:all要求全部成功,allsettled收集所有结果(含失败),race取最先settled者,any取首个成功者;混合场景需先收集promise再统一处理,并分层捕获错误。

Promise 本身不“合并”逻辑,而是通过组合方法把多个异步操作按不同规则协调起来。关键不是写得复杂,而是选对聚合方式——all、allSettled、race、any 各管一摊事,搭配链式处理和错误隔离,就能稳住复杂流程。
按全部成功才推进:用 Promise.all
适合所有步骤都必须完成的场景,比如初始化时并行拉取用户信息、权限配置、全局设置三个接口。
- 只要有一个失败,整个就立刻 reject,后续 Promise 仍会执行但结果被丢弃
- 返回结果数组严格按传入顺序排列,哪怕第三个请求最快也排在第三位
- 常见坑:没处理嵌套响应(比如 fetch 返回的是 Response 对象,不是 JSON),得再套一层 Promise.all
不管成败都要收尾:用 Promise.allSettled
当部分失败可接受,且你必须知道每个任务到底成没成时用它,比如批量提交表单、校验多个字段、清理多个缓存项。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 返回数组里每个对象带 status("fulfilled" 或 "rejected")、value 或 reason 字段
- 不会短路,所有 Promise 都跑完才结束,适合容错型批量操作
- 建议配合解构 + 条件判断提取成功数据,避免硬编码索引
抢最快结果或设超时:用 Promise.race 或 Promise.any
race 是“谁先定谁说了算”,any 是“第一个成功就赢”,两者都适合兜底或降级策略。
- race 常用于加超时控制:Promise.race([fetch(url), timeout(5000)])
- any 更实用在多源 fallback 场景,比如同时查本地缓存、CDN、主服务,只要一个返回数据就用
- 注意 race 中如果第一个是 reject,整个就立即 reject —— 它不区分成功失败,只看“谁先 settled”
串行+并行混合:链式 + all 搭配
真实业务很少纯串行或纯并行,往往是“先拿列表,再并发查详情”。这时候不能 for 循环里直接 await,得先收集 Promise,再统一处理。
- 错误要分层捕获:外层 catch 处理主流程失败,内层用 allSettled 或 try/catch 处理子任务异常
- 避免在循环中直接 push.then(),那只是启动任务,没等结果;正确做法是 map 出 Promise 数组再 all
- 大数量时考虑节流,比如每 5 个一组并发,防止浏览器或后端压力过大
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










