async/await 串行执行异步操作需在 async 函数中逐个 await,确保前一步结果作为后一步输入;漏写 await 会导致并发或报错;独立操作可用 Promise.all 并行;错误须用 try/catch 捕获以防止流程中断。

用 async/await 控制异步流程顺序,核心是让多个异步操作**一个接一个执行(串行)**,而不是同时发起(并行)。关键在于 await 后面跟 Promise,并且不把多个 await 写在同一个作用域里并发调用。
串行执行:一个完事再下一个
最常见也最直观的方式:在 async 函数中,用 await 逐个等待每个异步操作完成。
例如获取用户、再查订单、再更新状态:
async function getUserOrderStatus() {
const user = await fetch('/api/user').then(r => r.json());
const order = await fetch(`/api/order?uid=${user.id}`).then(r => r.json());
const result = await fetch('/api/status', {
method: 'POST',
body: JSON.stringify({ orderId: order.id })
}).then(r => r.json());
return result;
}
✅ 这三步严格按顺序执行,前一步结果是后一步的输入。
立即学习“Java免费学习笔记(深入)”;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
避免“假串行”:别忘了 await
容易出错的情况:漏写 await,导致看似串行,实则并发或报错。
- ❌ 错误:没 await,
fetch返回的是 Promise,但没等它 resolve 就继续了 - ❌ 错误:
const user = fetch(...)→user是 Promise 对象,不是数据;后续用user.id会报Cannot read property 'id' of undefined - ✅ 正确:每一步都
await,确保拿到实际返回值再往下走
需要并行时,主动用 Promise.all
如果几个异步操作彼此独立(比如同时拉取用户信息和配置项),想提速,就不要用 await 串着写,改用 Promise.all:
async function loadUserAndConfig() {
const [user, config] = await Promise.all([
fetch('/api/user').then(r => r.json()),
fetch('/api/config').then(r => r.json())
]);
return { user, config };
}
⚠️ 注意:这和串行逻辑不同,适合无依赖关系的操作。混用时要分清场景。
错误处理:用 try/catch 包住 await 链
任意一个 await 抛错,都会中断后续执行。用 try/catch 捕获,避免整个流程崩掉:
async function safeFlow() {
try {
const a = await step1();
const b = await step2(a);
const c = await step3(b);
return c;
} catch (err) {
console.error('某步失败:', err.message);
// 可选择抛出、降级、返回默认值等
throw new Error('流程中断');
}
}
不加 try/catch,错误会变成 rejected Promise,调用方需用 .catch() 或外层 try/catch 处理。

















