Promise链式调用通过每个then返回新Promise实现状态自动流转,支持平铺逻辑、集中错误处理及finally清理;配合all/race/allSettled可灵活应对并行、竞速等场景。

用 Promise 链式调用解决异步回调嵌套,关键不是“写得长”,而是让每一步只关心自己的输入和输出,状态自动流转、错误集中处理、逻辑平铺直叙。
Promise 链式调用的核心机制
每个 then() 方法都返回一个新的 Promise 实例,因此可以连续调用。这个新 Promise 的状态由上一个 then 回调函数的返回值决定:
- 返回普通值(如字符串、数字、对象)→ 新 Promise 状态为 fulfilled,值就是该返回值
- 返回另一个 Promise → 新 Promise 状态和结果,完全由它决定(自动等待、自动透传)
- 抛出异常或调用 reject() → 新 Promise 状态为 rejected,reason 就是错误
把嵌套回调改造成链式调用
传统回调地狱示例:
getUser(id, (user) => {
getPosts(user.id, (posts) => {
filter(posts, (filtered) => {
render(filtered);
});
});
});
改写为 Promise 链式调用:
getUser(id)
.then(user => getPosts(user.id))
.then(posts => filter(posts))
.then(render)
.catch(err => console.error('任一环节失败:', err));
每一步只接收上一步成功的结果,无需手动传递 callback,也不用层层缩进。
错误统一捕获与中间态处理
链中任意环节出错(包括 resolve 后的同步错误、异步 reject、throw 异常),都会跳过后续所有 then 的成功回调,直接进入最近的 catch:
- .catch() 等价于 .then(null, onRejected),但更清晰、更常用
- 如果想在某步“吞掉”错误并继续链式执行,可用 .then(onFulfilled, onRejected) 显式返回默认值或新 Promise
- 需要无论成功失败都执行清理操作?用 .finally(() => {...})(不接收参数,不影响链下游状态)
常见组合场景实战
实际开发中不止是串行,还要应对并行、竞速等需求:
- 多个请求同时发,等全部完成 → Promise.all([p1, p2, p3]),全 fulfilled 才 resolve,任一 rejected 整体 reject
- 多个请求发出去,只要第一个回来就用 → Promise.race([p1, p2, p3]),谁先定型谁胜出
- 部分失败可接受,想拿到所有结果(含错误) → Promise.allSettled([p1, p2, p3])(ES2020+)


















