async/await 通过逐层 await 等待前序 Promise 完成并用变量承接返回值,实现依赖步骤的顺序执行;需用 try/catch 统一捕获错误,且不可遗漏 await 否则将得到 Promise 而非实际值。

async/await 处理依赖上一步结果,核心就是「用 await 等待前一个 Promise 完成,再把它的返回值传给下一步」——不需要额外包装,直接链式写就行。
顺序执行:await 后直接用返回值
如果第二步操作必须用第一步的返回结果(比如获取用户 ID 后查详情),就让第一个 await 的结果赋值给变量,然后在下一步中直接使用:
示例:
async function getUserData() {
const userId = await fetchUserId(); // 假设返回 123
const user = await fetchUserById(userId); // 直接传入上一步结果
return user;
}
这里 fetchUserById 能拿到 userId,是因为 await fetchUserId() 已经等它 resolve 并把值赋给了变量。
立即学习“Java免费学习笔记(深入)”;
多个依赖步骤:逐层 await + 变量承接
三步甚至更多步依次依赖时,每步都用 await 等待,并用清晰的变量名保存中间结果,避免嵌套或魔数:
- 先登录拿到 token
- 用 token 请求用户信息
- 再用用户信息里的 orgId 请求部门列表
写法示例:
async function loadUserProfile() {
const token = await login();
const user = await getUser(token);
const departments = await getDepartments(user.orgId);
return { user, departments };
}
每一步都依赖前一步输出,逻辑平铺、可读性强,调试也方便定位哪一步出错。
错误处理:用 try/catch 包住整个流程
因为任何一步 reject 都会中断后续执行,所以推荐用一个 try/catch 包住全部 await 步骤:
async function loadData() {
try {
const id = await getId();
const data = await getData(id);
const extra = await getExtra(data.type);
return { id, data, extra };
} catch (err) {
console.error('某一步失败了', err);
throw err; // 或返回默认值、重试等
}
}
这样任意环节出错都会进 catch,不用为每个 await 单独加 try/catch。
注意:别忘了 await,否则拿不到实际值
常见错误是漏写 await,导致变量存的是 Promise 对象而不是结果:
// ❌ 错误:没 await,user 是 Promise,不是对象 const user = fetchUser(); // ← 少了 await console.log(user.name); // 报错:Cannot read property 'name' of undefined // ✅ 正确:await 确保拿到解析后的值 const user = await fetchUser(); console.log(user.name); // OK
尤其在条件分支或循环里容易忽略,建议开启 ESLint 规则 require-await 和 no-return-await 辅助检查。


















