async-await将链式.then()转为同步写法,使逻辑平铺直叙、错误集中处理、中间值自然复用,并支持promise.all并发及封装复用。

用 async-await 替代多重 .then() 嵌套,核心是把“链式回调”转成“同步写法”,让逻辑平铺直叙、错误处理集中、中间值自然复用。
把嵌套的 .then() 一层层“展平”
原来容易陷入“地狱金字塔”的写法:
fetch('/api/user')
.then(res => res.json())
.then(user => fetch(`/api/posts?uid=${user.id}`))
.then(res => res.json())
.then(posts => fetch(`/api/comments?pid=${posts[0].id}`))
.then(res => res.json())
.catch(err => console.error(err));
改用 async-await 后,每一步都像写同步代码一样直观:
- 每个 await 等待一个 Promise 完成,结果直接赋值给变量
- 后续步骤可直接使用前面的变量,无需层层传递
- 避免了嵌套缩进,逻辑从上到下线性展开
统一用 try-catch 处理所有异步错误
多个 .then() 链中,.catch() 只能捕获链中任一环节抛出的错误,但位置靠后、作用域模糊;async-await 中,一个 try-catch 就能包裹全部 await 步骤:
async function loadUserData() {
try {
const userRes = await fetch('/api/user');
const user = await userRes.json();
const postsRes = await fetch(`/api/posts?uid=${user.id}`);
const posts = await postsRes.json();
const commentsRes = await fetch(`/api/comments?pid=${posts[0]?.id}`);
const comments = await commentsRes.json();
return { user, posts, comments };
} catch (err) {
console.error('加载失败:', err.message);
throw err; // 或返回默认值、重试等
}
}
错误堆栈更清晰,也方便做统一兜底(比如展示提示、上报日志)。
OpenJDK 24 Windows x64 官方参考实现(24+36),适合 Windows 环境进行 Java 开发、编译、运行和版本兼容性验证。
按需并发请求,不盲目串行
不是所有异步操作都必须串行。若某步不依赖前一步结果,可用 Promise.all() 并发执行,再配合 await 提升效率:
- 例如:同时获取用户信息和热门文章,二者无依赖
- 写法:
const [user, trending] = await Promise.all([fetchUser(), fetchTrending()]); - 仍保持 async-await 的简洁性,又避免了不必要的等待
封装可复用的异步函数,避免重复 try-catch
高频调用的 API 请求,可单独封装为带错误处理的 async 函数,业务层专注逻辑:
async function apiGet(url) {
const res = await fetch(url);
if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);
return res.json();
}
// 使用时干净利落
async function dashboardData() {
try {
const user = await apiGet('/api/user');
const stats = await apiGet('/api/stats');
return { user, stats };
} catch (err) {
// 仅处理业务级异常,如降级或提示
}
}
这样既解耦了网络细节,又让业务函数更聚焦、更易测试。
不复杂但容易忽略:await 只能用在 async 函数里,顶层 await 在模块中可用(ES2022+),但常规脚本中需包一层 IIFE 或放在事件回调里。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










