promise链式调用通过每个then返回新promise实现平铺异步流程:用户数据→订单→物流,错误由catch统一捕获;避免在then内嵌套回调,正确做法是直接return新promise;async/await为其语法糖,提升可读性。

用 Promise 链式调用替代嵌套回调,核心是每次 then 返回一个新的 Promise,让后续操作接在它后面,而不是层层缩进写在回调里。
用 then 串联异步操作
每个 then 的回调函数返回值会自动包装成 Promise(除非返回的是 Promise 实例,那就直接使用它)。这样就能把多个异步步骤平铺展开:
- 第一次请求用户数据 →
then处理用户信息并发起第二个请求(如获取订单) - 第二个请求完成 →
then处理订单并发起第三个请求(如查物流) - 最后统一用
catch捕获任意环节的错误
示例:
fetch('/api/user')
.then(res => res.json())
.then(user => fetch(`/api/orders?userId=${user.id}`))
.then(res => res.json())
.then(orders => fetch(`/api/tracking?id=${orders[0].trackingId}`))
.then(res => res.json())
.then(tracking => console.log(tracking))
.catch(err => console.error('出错了:', err));
避免在 then 里写回调函数嵌套
常见错误是把下一个 fetch 写在 then 的回调内部再套 then,这又变回回调地狱。正确做法是让每个 then 只做一件事,并把下一步的 Promise 当作返回值:
- ❌ 错误:在
then里调用fetch(...).then(...),再在里面写逻辑 - ✅ 正确:
then回调直接return fetch(...),让链式结构自然延续
用 async/await 进一步简化(本质仍是 Promise 链)
虽然不是传统链式写法,但 async/await 是 Promise 链的语法糖,可读性更强,也彻底消除嵌套:
- 每个
await等待一个 Promise 完成,之后代码继续向下执行,像同步一样 - 仍可用
try/catch统一捕获异常,逻辑更清晰
等效写法:
async function getUserOrderTracking() {
try {
const user = await (await fetch('/api/user')).json();
const orders = await (await fetch(`/api/orders?userId=${user.id}`)).json();
const tracking = await (await fetch(`/api/tracking?id=${orders[0].trackingId}`)).json();
console.log(tracking);
} catch (err) {
console.error('出错了:', err);
}
}
注意错误传递和 Promise 状态控制
链中任何一个 Promise 被 reject,就会跳过后续所有 then,直到遇到 catch 或带错误处理的 then(onFulfilled, onRejected):
- 想“吞掉”某个错误并继续链式执行?在对应
then后加一个返回正常值的catch - 不想让错误中断流程,又需要区分成功失败,可用
Promise.allSettled或手动封装
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











