async/await可提升异步代码可读性与可维护性,需配合try/catch错误处理、promise.all并发控制及工具函数封装,避免回调地狱与串行性能瓶颈。

用 async/await 配合合理的错误处理、资源管理与结构分层,能让异步逻辑清晰、可读、易维护。
优先使用 async/await,而非嵌套 Promise.then
它让异步代码看起来像同步逻辑,避免“回调地狱”和冗长的链式调用。注意函数必须用 async 声明,内部用 await 等待 Promise 结果。
- 不要这样写: fetch('/api/user').then(res => res.json()).then(data => fetch(`/api/posts?uid=${data.id}`)).then(...)
- 推荐这样写: async function loadUserData() {
const res = await fetch('/api/user');
const user = await res.json();
const postsRes = await fetch(`/api/posts?uid=${user.id}`);
return await postsRes.json();
}
主动捕获异常,别让 await 失败导致整个流程中断
await 后的 Promise 被 reject 会直接抛出错误,需用 try/catch 包裹。对非关键异步操作(如埋点、日志),也可用 .catch() 局部兜底。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 关键路径必须 try/catch: try {
- 非关键操作可静默处理: trackEvent('page_view').catch(() => {});
const data = await api.fetchOrder(orderId);
renderOrder(data);
} catch (err) {
showError('订单加载失败,请重试');
logError(err);
}
合理控制并发,避免无节制 await 导致性能瓶颈
多个独立请求不必串行等待,可用 Promise.all 或 Promise.allSettled 并发执行;对有依赖的请求,再按需 await。
- 并行获取用户信息和通知数: const [user, notifications] = await Promise.all([
- 想确保全部完成(含失败)再统一处理: const results = await Promise.allSettled([
api.getUser(),
api.getNotifications()
]);
api.saveDraft(),
api.syncTags()
]);
results.forEach(r => r.status === 'rejected' && console.warn(r.reason));
封装常用异步行为,提升复用性与一致性
把重复模式抽成工具函数:带 loading 状态的请求、自动重试、防抖提交、超时控制等。避免每个组件里都手写 try/catch + loading 开关。
- 例如封装一个带超时和错误标准化的 fetch: async function safeFetch(url, options = {}) {
- 业务层调用就干净了: const profile = await safeFetch('/api/profile');
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 8000);
try {
const res = await fetch(url, { ...options, signal: controller.signal });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} finally { clearTimeout(timeout); }
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










