用promise链式调用或async/await替代回调嵌套,可将异步流程线性化:promise.then自动传递结果并统一.catch错误;async/await使代码同步化,支持try/catch精准捕获;封装通用请求函数提升复用性;无依赖时优先用promise.all并发请求。

用 Promise 链式调用或 async/await 替代多层嵌套回调,是最直接有效的解法。核心不是“怎么写嵌套”,而是“怎么不写嵌套”——把异步流程变成线性可读的结构。
用 Promise.then 链式传递数据
每个异步操作返回一个 Promise,上一步的 成功结果 会自动传给下一步的 then 回调,避免手动层层传参。
- 第一步请求省份,拿到
pname后直接 return 下一个 Promise(城市请求) - 第二步拿到
cname,再 return 地区请求 - 所有错误统一用
.catch()捕获,不用在每一层写if (err)
示例:
axios({ url: '/api/province' })
.then(res => {
const pname = res.data.list[0];
document.querySelector('.province').textContent = pname;
return axios({ url: '/api/city', params: { pname } }); // 返回新 Promise
})
.then(res => {
const cname = res.data.list[0];
document.querySelector('.city').textContent = cname;
return axios({ url: '/api/area', params: { pname, cname } });
})
.then(res => {
const areaName = res.data.list[0];
document.querySelector('.area').textContent = areaName;
})
.catch(err => console.error('某一步出错:', err));
用 async/await 写得像同步代码
async 函数内部,await 会暂停执行,直到 Promise settle,之后继续往下走。逻辑顺序一目了然,调试也和普通代码一样打断点。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 函数必须声明为
async,内部才能用await - 每个
await后面跟一个 Promise,它会自动解包成功值 - 用
try/catch捕获任意一步的失败,比链式catch更直观
示例:
async function loadLocation() {
try {
const provinceRes = await axios('/api/province');
const pname = provinceRes.data.list[0];
document.querySelector('.province').textContent = pname;
const cityRes = await axios('/api/city', { params: { pname } });
const cname = cityRes.data.list[0];
document.querySelector('.city').textContent = cname;
const areaRes = await axios('/api/area', { params: { pname, cname } });
const areaName = areaRes.data.list[0];
document.querySelector('.area').textContent = areaName;
} catch (err) {
console.error('加载位置失败:', err);
}
}
封装通用请求函数降低重复
如果多个页面都要串行请求省市区,可以把基础逻辑抽成可复用的工具函数,比如:
- 定义
getProvince()、getCity(pname)、getArea(pname, cname)等独立 Promise 函数 - 业务层只负责组合调用,不关心 xhr 或 axios 细节
- 后续加 loading、缓存、重试等能力,只需改封装层,不影响业务调用
慎用 Promise.all 处理并行而非串行
如果几个请求之间没有依赖(比如同时拉用户信息、订单列表、通知数),就别强行串起来。用 Promise.all([p1, p2, p3]) 并发发起,更快且更简洁。
- 它等待所有 Promise 完成,返回结果数组,顺序与入参一致
- 只要一个失败,整个就 reject,需配合
Promise.allSettled做更细粒度控制 - 不要为了“看起来高级”而滥用 —— 有先后依赖时,串行才是合理选择
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










