用 promise 链式调用或 async/await 可清晰处理接口级联依赖:前者需每个 .then() 返回新 promise,后者语义更直观、支持 try/catch 统一捕获错误;复杂场景可组合 promise.all() 实现并行+串行混合请求,并注意 fetch 错误需手动检查 res.ok。

用 Promise 处理多个接口依赖的级联调用,核心是让后一个请求等前一个请求成功返回后再发起,避免嵌套回调(callback hell),同时保持逻辑清晰、错误可捕获。
用 .then() 链式传递数据
最直接的方式是把上一个接口的响应结果作为参数,传给下一个 .then() 中的函数,再发起新请求:
fetch('/api/user/123')
.then(res => res.json())
.then(user => {
// 拿到 user 后再查他的订单
return fetch(`/api/orders?userId=${user.id}`);
})
.then(res => res.json())
.then(orders => {
console.log('用户和订单都拿到了:', { user, orders });
})
.catch(err => console.error('出错了:', err));
注意:每个 .then() 回调里必须 return 新的 Promise(比如新的 fetch),否则链会中断,后续 .then() 接收到的是 undefined。
用 async/await 让代码更接近同步写法
这是目前推荐的方式,语义更清晰,也更容易处理中间变量和条件分支:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
async function loadUserWithOrders() {
try {
const userRes = await fetch('/api/user/123');
const user = await userRes.json();
const orderRes = await fetch(`/api/orders?userId=${user.id}`);
const orders = await orderRes.json();
return { user, orders };
} catch (err) {
console.error('加载失败:', err);
throw err;
}
}
关键点:
- 每个 await 会暂停函数执行,直到 Promise settled(fulfilled 或 rejected)
- 不需要手动 return Promise,函数自动返回 Promise
- 错误统一用 try/catch 捕获,比链式 .catch() 更直观
处理更复杂的依赖关系(如分支或并行+串行混合)
如果第三步要根据第二步结果决定发哪个接口,或者某些请求可以并行、某些必须串行,可以组合使用 Promise.all() 和 await:
async function loadUserProfile() {
const userRes = await fetch('/api/user/123');
const user = await userRes.json();
// 用户信息和头像可并行获取
const [profileRes, avatarRes] = await Promise.all([
fetch(`/api/profile?userId=${user.id}`),
fetch(`/api/avatar/${user.avatarId}`)
]);
const profile = await profileRes.json();
const avatar = await avatarRes.json();
return { user, profile, avatar };
}
这种写法既保持了串行依赖(先拿 user),又在后续步骤中合理并行,提升性能。
常见坑和建议
- 不要忘记 await:漏写会导致拿到的是 Promise 对象而非实际数据
- 避免在循环里无限制 await:如需批量串行请求,可用 reduce 或递归;如需并行,用 Promise.all()
- 接口报错时记得 reject 或 throw:fetch 默认不会因 HTTP 错误状态码(如 404、500)reject,需手动检查 res.ok
- 封装通用请求函数,内部统一处理 token、错误提示、loading 等,让业务层专注逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










