Promise 是基于 Promises/A+ 规范的异步编程抽象机制,隐式支撑工厂、策略、组合、责任链、观察者、单例、装饰器和门面等多种设计模式,关键在于按需解耦、编排与封装。

Promise 本身不是设计模式,而是一种规范化的异步编程抽象机制(基于 Promises/A+ 规范),但它天然承载并支撑多种经典设计模式的思想,在项目中常以“隐式组合”方式落地,而非生硬套用模式名称。关键不在于贴标签,而在于用对时机、理清职责、规避副作用。
封装异步操作:工厂 + 策略模式的实践
把重复的异步逻辑(如 API 请求、文件读取、定时任务)封装成返回 Promise 的函数,本质是将“如何发起异步操作”与“业务逻辑如何使用结果”解耦。
- 统一入口:每个请求函数(如 api.getUsers()、storage.loadConfig())都返回 Promise,调用方只关心 then/catch,不关心底层是 fetch、axios 还是 mock 数据
- 策略可插拔:内部可根据环境切换实现——开发时用 mock Promise,生产走真实 HTTP;错误重试逻辑可封装为独立策略函数,传入主请求函数复用
- 示例:const fetchData = (url, strategy = defaultRetry) => strategy(() => fetch(url).then(r => r.json()))
组合多个异步任务:组合模式 + 责任链的体现
Promise 链式调用(.then().then().catch())天然符合责任链思想:每个 then 处理前一个环节的输出,并决定是否继续传递;catch 是统一的错误拦截节点。
- 串行依赖:用户登录 → 获取 token → 拉取权限 → 渲染菜单,每步返回 Promise,失败自动中断并交由末尾 catch 处理
- 并行聚合:用 Promise.all([p1, p2, p3]) 同时发起多个无关请求,像组合多个子组件一样组装最终数据结构
- 容错编排:搭配 Promise.allSettled 或手动包装 reject 为 resolve,让部分失败不影响整体流程(如日志上报不阻塞主业务)
状态协调与资源管理:观察者 + 单例的轻量延伸
Promise 实例本身不可取消、不可重置,但可通过包装层引入状态协调能力,接近观察者模式语义:
- 加载状态管理:一个 loadingState 对象可被多个组件订阅(如通过 ref 或 context),其变更由 Promise 生命周期驱动(pending → fulfilled/rejected)
- 防重复请求:对同一参数的请求,缓存其 Promise 实例(单例式),后续调用直接复用,避免并发触发相同接口
- 超时控制:用 Promise.race([request, timeout()]) 实现“竞态”,本质是监听多个 Promise 中最先 settle 的那个,类似事件总线中的优先响应机制
错误流与边界隔离:装饰器 + 门面模式的落地点
在 Promise 链中插入标准化错误处理、日志、监控,就是装饰器思想;对外暴露统一的 Promise 接口,屏蔽内部复杂度,则是门面模式。
- 统一错误分类:所有 API 封装层 catch 错误后,统一转为业务错误码(如 NETWORK_ERROR、AUTH_EXPIRED),上层无需解析原生 Error 对象
- 埋点装饰:在关键链路 .then 前后注入性能打点,或用 finally 清理 loading 状态,不侵入业务逻辑
- 门面聚合:对外只提供 UserService.fetchProfile() 这样的高层 Promise 方法,内部可能串联鉴权、缓存检查、网络请求、数据格式化多个步骤


















