promise 链式调用的核心是每个 then 都返回新 promise,实现异步操作的顺序执行;返回普通值则下个 then 接收该值,返回 promise 则等待其完成,抛错或 reject 则跳转至最近 catch 或 then 的失败回调。

Promise 的 then 链式调用,核心在于每个 then 方法都返回一个新的 Promise,从而让异步操作可以像同步代码一样“一环接一环”地写下去。
then 的基本结构和返回值规则
每个 then(onFulfilled, onRejected) 接收两个回调函数:第一个处理上一个 Promise 成功的结果,第二个处理失败(可选)。关键点是:
- 如果
onFulfilled返回一个普通值(比如字符串、数字、对象),下一个then会接收到这个值,并且其 Promise 状态为fulfilled - 如果
onFulfilled返回一个 Promise,下一个then会等待它完成,再传入它的结果 - 如果
onFulfilled抛出错误或返回被 reject 的 Promise,控制权会跳转到后续最近的catch或then的第二个参数
常见链式写法示例
比如依次请求用户信息 → 获取其订单 → 查询订单详情:
fetch('/api/user')
.then(res => res.json())
.then(user => fetch(`/api/orders?userId=${user.id}`))
.then(res => res.json())
.then(orders => fetch(`/api/order/${orders[0].id}`))
.then(res => res.json())
.then(detail => console.log('最终详情:', detail))
.catch(err => console.error('某一步出错了:', err));
每一步的返回值(无论是数据还是新的 Promise)都会自动“传递”给下一个 then,不需要手动包装 Promise。
在链中处理错误和中间转换
链式调用不意味着只能 success 路径畅通。你可以在任意环节做数据加工、条件判断或提前终止:
- 用
then做数据清洗:.then(data => ({ ...data, processed: true })) - 用
then实现条件分支:.then(user => user.isAdmin ? fetch('/api/admin') : Promise.resolve(null)) - 统一错误处理推荐用
catch放在末尾,比每个then都写第二个参数更清晰
避免常见陷阱
容易出错的地方包括:
- 忘记
return:在then回调里漏写return,会导致下一个then收到undefined - 混用回调风格:在
then里又写setTimeout或其他异步但没返回 Promise,会打断链路 - 误以为
then是同步执行:它总是异步调度(微任务),即使上一个 Promise 已立即 resolve,下一个then也不会立刻运行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











