Promise 通过状态封装、链式响应和统一错误处理使异步逻辑更可控、可读、可维护;其状态不可逆,链式调用支持顺序依赖与并发组合,.catch() 提供集中错误边界。

Promise 不是让异步“变同步”,而是让异步逻辑更可控、可读、可维护。它通过状态封装、链式响应和统一错误处理,把原本散乱的回调变成清晰的执行流。
明确状态流转,避免“黑盒”操作
每个 Promise 实例只有三种状态:pending(进行中)、fulfilled(成功)、rejected(失败)。状态一旦确定就不可逆——这决定了你不能靠多次调用 resolve/reject 来“重试”或“覆盖”结果。
- 构造时必须传入执行器函数,且 resolve 和 reject 是唯一能触发状态变更的入口
- resolve 传入的值会成为后续 .then() 的参数;reject 抛出的错误会被 .catch() 捕获
- 不要在 resolve 后再调用 reject(反之亦然),否则后者会被忽略
用链式调用组织顺序依赖
每个 .then() 都返回一个新的 Promise,天然支持线性流程。前一步的结果可以直接作为下一步的输入,无需嵌套或手动保存中间变量。
- 在 .then() 回调里 return 一个值 → 下一个 .then() 接收该值
- return 一个 Promise → 下一个 .then() 等待它完成后再执行
- 不 return 或 return undefined → 下一个 .then() 收到 undefined
- 抛出错误或 return Promise.reject() → 跳转到最近的 .catch()
合理组合并发与竞速场景
单个 Promise 处理串行逻辑,多个 Promise 协同才能应对真实业务中的复杂调度。
- Promise.all():所有任务都成功才继续,任一失败则整体失败,适合批量提交、多资源加载
- Promise.race():谁先完成(无论成败)就响应谁,常用于超时控制或接口兜底
- Promise.allSettled():等待全部结束,不管成败,返回每个结果的状态对象
- Promise.any():只要有一个成功就 resolve,全部失败才 reject,适合容错型聚合请求
统一错误边界,减少重复捕获
.catch() 会捕获链中任意环节抛出的错误,包括 Promise 内部 reject、.then() 中 throw 的异常,甚至解析 JSON 失败这类运行时错误。
- 推荐把 .catch() 放在整个链末尾,集中处理业务级错误(如提示用户、跳转错误页)
- 若某环节需要“吞掉”错误并转为默认值,可在对应 .then() 后接 .catch(() => defaultValue)
- 避免在每个 .then() 后都写 .catch(),容易导致错误被静默处理或重复响应










