async/await 是 Promise 的语法糖,async 函数必返回 Promise,await 只能在 async 函数内使用;独立异步操作应优先用 Promise.all 并行,避免无依赖的串行 await 拖慢性能。

async/await 是 JavaScript 中用来写异步代码的语法糖,本质就是 Promise 的封装,它不改变异步行为,但让代码读起来像同步——await 会“暂停”当前函数执行(仅逻辑上),等 Promise 完成后再继续,而不会阻塞整个线程。
async 函数为什么必须返回 Promise?
只要用 async 声明函数,无论有没有 await、有没有 return,它就自动返回一个 Promise:
- 显式
return 42→ 等价于Promise.resolve(42) - 抛出错误
throw new Error()→ 等价于Promise.reject(...) - 没写
return→ 返回Promise.resolve(undefined)
这意味着调用方必须用 .then() 或外层 await 处理结果,不能直接取值。
async function getValue() {
return "hello";
}
console.log(getValue()); // Promise {: "hello"}
getValue().then(console.log); // 输出: "hello"
await 只能在 async 函数里用,否则报错
这是硬性限制,不是风格建议。下面这些写法都会触发 SyntaxError: await is only valid in async functions:
立即学习“Java免费学习笔记(深入)”;
-
function foo() { await fetch('/api'); }(普通函数) -
[1,2].forEach(() => { await delay(100); })(箭头函数非 async) -
setTimeout(() => { await doAsync(); }, 100)(回调函数)
正确做法:把逻辑包进 async 函数,或改用 for...of 配合 await:
async function runInSequence() {
for (const item of ['a', 'b', 'c']) {
const res = await fetch(`/api/${item}`);
console.log(await res.json());
}
}
别把独立请求写成串行 await,那是性能杀手
连续写多个 await 看似清晰,但如果它们之间没有依赖关系,实际是「一个接一个发请求」,耗时叠加:
// ❌ 串行:总耗时 ≈ 1000ms + 800ms = 1800ms const user = await fetchUser(); const posts = await fetchPosts(); // ✅ 并行:总耗时 ≈ max(1000ms, 800ms) = 1000ms const [user, posts] = await Promise.all([fetchUser(), fetchPosts()]);
常见误判点:
-
Promise.all中任意一个 Promise reject,整个就会失败 → 需要提前兜底或用Promise.allSettled - 如果后续逻辑依赖前一步结果(比如用 token 换用户信息),才必须串行
await
最常被忽略的一点:await 不是“让 JS 变同步”,它只是让开发者不用手动写 .then() 链;底层仍是事件循环 + 微任务队列。写错位置(比如在循环里盲目 await)或漏掉 try/catch,轻则逻辑中断,重则未捕获异常导致静默失败。











