promise通过状态管理和静态方法实现异步流程可控:串行用链式或async/await,无依赖并行用promise.all/allsettled,竞速选promise.race/any,容错需隔离错误提升韧性。

Promise 提供了一套清晰、可控的机制来管理异步流程,核心在于利用其状态(pending/fulfilled/rejected)和静态方法,按需选择串行、并行或容错策略,而不是让异步操作“自由发生”。
串行执行:依赖明确时用链式调用或 async/await
当后一步必须等前一步结果才能开始(比如获取 token 后再请求用户数据),链式调用是最自然的选择。每个 .then() 返回新 Promise,天然形成执行链条;async/await 则让逻辑更贴近同步写法,可读性更强。
- 链式写法适合简单流程,注意错误统一由最后的 .catch() 捕获
- async/await 更易调试和插入中间逻辑(如日志、条件判断),但必须包裹在 async 函数内
- 避免在链中遗漏 return,否则后续 .then() 接收到的是 undefined
并行执行:无依赖任务用 Promise.all 或 Promise.allSettled
多个独立请求(如同时拉取头像、订单、通知)应并发发起,而非排队等待。Promise.all 是最常用方式,它要求全部成功才返回结果;若允许部分失败(比如批量推送消息),则改用 Promise.allSettled,它总会返回一个包含每个 Promise 状态的对象数组。
- Promise.all 的结果顺序严格对应输入数组顺序,与完成时间无关
- 只要有一个失败,Promise.all 就立刻 reject,不等待其余任务——这是“快速失败”设计
- Promise.allSettled 不会 reject,适合监控类、上报类等容忍局部失败的场景
竞速与降级:用 Promise.race 和 Promise.any 应对不确定性
当存在多个等效资源(如多个 CDN 地址、备用 API 接口),目标是尽快拿到可用结果,就该用竞速类方法。Promise.race 返回第一个 settled(无论成功或失败)的结果;Promise.any 则只关心第一个 fulfilled,忽略早期 rejection,直到至少一个成功才 resolve。
- Promise.race 常用于超时控制:把业务 Promise 和一个定时 reject 的 Promise 一起 race
- Promise.any 更适合“多源取优”场景,比如从多个镜像站下载文件,取最快成功的那个
- 注意:Promise.any 在全部 rejected 时会抛出 AggregateError,需专门捕获
错误隔离与流程韧性:避免单点失败阻断整体
真实工程中,不能假设所有异步操作都可靠。单纯用 Promise.all 容易因一个接口报错导致整块逻辑中断。可通过包装单个 Promise 实现“失败转成功”,或结合 allSettled + 过滤处理,提升流程鲁棒性。
- 封装工具函数如 safePromise(fn),内部 catch 错误并返回 { ok: false, data: null, error } 结构
- 对 allSettled 结果遍历判断 status 字段,区分 success/failure 并分别处理
- 关键路径仍建议保留原始 reject 机制,仅对非核心依赖做容错,避免掩盖真正问题











