async函数不封装异步操作,而是通过await组织等待promise;串行用await依次执行,依赖场景清晰可读;并行用promise.all()提升性能;部分失败用promise.allsettled()容错;超时重试需手动封装promise。

async 函数本身不“包装”多个异步操作,而是提供一种更清晰的写法来**组织和等待**多个 Promise。真正起封装作用的是 Promise 本身;async/await 是它的语法糖,让串行或并行协调变得更自然。
用 await 依次等待多个异步操作(串行)
每个 await 会暂停函数执行,直到前一个 Promise settle(成功或失败),再继续下一步。适合有依赖关系的操作,比如“先登录 → 再获取用户信息 → 再拉取订单列表”:
- 确保上一步结果是下一步的输入
- 错误可用单层 try/catch 捕获
- 代码线性可读,避免嵌套
示例:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
try {
const user = await fetch(`/api/user/${userId}`).then(r => r.json());
const posts = await fetch(`/api/posts?uid=${user.id}`).then(r => r.json());
const comments = await fetch(`/api/comments?uid=${user.id}`).then(r => r.json());
return { user, posts, comments };
} catch (err) {
console.error("加载失败:", err);
}
}
用 Promise.all() 并行发起多个独立请求
当几个异步操作互不依赖(比如同时加载头像、通知数、未读消息),应优先用 Promise.all() 配合 await,而不是连续 await —— 后者会变慢一倍以上:
- 所有 Promise 同时启动,总耗时≈最慢那个
- 全部成功才 resolve,返回数组;任一失败则整体 reject
- 可在 async 函数中直接 await Promise.all([...])
示例:
async function loadDashboard() {try {
const [avatar, count, messages] = await Promise.all([
fetch('/api/avatar').then(r => r.json()),
fetch('/api/notify-count').then(r => r.json()),
fetch('/api/messages').then(r => r.json())
]);
return { avatar, count, messages };
} catch (err) {
console.error("仪表盘加载异常", err);
}
}
处理部分失败:Promise.allSettled()
如果某些请求失败也不该中断整体流程(比如“头像加载失败但通知数必须显示”),就换用 Promise.allSettled():
- 不管成功或失败,每个 Promise 都返回一个 { status, value / reason } 对象
- 不会因某个失败而 reject 整个集合
- 适合容错型聚合场景
示例:
const results = await Promise.allSettled([fetch('/api/avatar'),
fetch('/api/notify-count')
]);
results.forEach((res, i) => {
if (res.status === 'fulfilled') {
console.log(`第${i+1}项成功`, res.value);
} else {
console.warn(`第${i+1}项失败`, res.reason);
}
});
需要超时或重试时,得靠 Promise 封装增强
async/await 不自带超时、重试、日志等能力。这些要靠手动封装 Promise 或使用工具函数:
- 加超时:用 Promise.race([原Promise, new Promise(...setTimeout reject...)])
- 加重试:写一个返回 Promise 的 retry 函数,内部用循环 + await + try/catch
- 加统一错误格式:用 to() 封装(类似 Go 的 error, result 返回对),避免层层 try/catch
例如简易超时封装:
function timeout(promise, ms) {return Promise.race([
promise,
new Promise((_, reject) =>
setTimeout(() => reject(new Error('请求超时')), ms)
),
]);
}
// 使用:
const data = await timeout(fetch('/api/data'), 5000);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










