async/await是用同步风格编写异步逻辑的语法糖,不改变异步本质;async函数自动返回Promise,await仅在async函数内暂停执行并等待Promise落定,需用try/catch处理错误,多请求应使用Promise.all([p1,p2])并行而非串行。

async/await 不是让异步变同步,而是用同步风格写异步逻辑——它不阻塞线程,也不改变异步本质,只是让代码更易读、更易维护。
async 函数:自动返回 Promise
加了 async 的函数,无论内部写什么,返回值都会被自动包装成 Promise。如果 return 一个普通值,比如 return 42,实际等价于 return Promise.resolve(42);如果抛错,等价于 return Promise.reject(err)。
- 不能用
await在普通函数或顶层作用域(ES2022 之前)中直接写 -
async function foo() {}和const foo = async () => {}行为一致
await:暂停执行,等待 Promise 落定
await 只能在 async 函数内使用,它会让 JS 引擎“暂停”当前函数的执行(注意:不是卡住线程),等右侧的 Promise 成功 resolve 后,再把结果作为表达式的值继续往下走。如果 Promise 被 reject,就相当于 throw 了一个错误,可以用 try/catch 捕获。
-
const data = await fetch('/api').then(r => r.json())✅ 可以,但没必要——await 本身已处理 then -
const data = await fetch('/api').json()❌ 错误,fetch() 返回 Promise,.json() 是方法调用,不是 Promise - 正确写法:
const res = await fetch('/api'); const data = await res.json();
错误处理:用 try/catch,别靠 .catch
await 后的 Promise 如果 reject,会直接冒泡成异常。所以推荐用 try/catch 包裹,语义清晰,也方便捕获中间多个 await 的错误。
立即学习“Java免费学习笔记(深入)”;
- 避免这样:
getData().catch(handleError)—— 失去了 await 的链式可读性 - 推荐这样:
try { const a = await step1(); const b = await step2(); } catch (e) { handleError(e); } - 多个并行请求?用
Promise.all([await p1, await p2])是错的——会串行。应写成await Promise.all([p1, p2])
它没解决的根本问题:异步仍是异步
await 不会让 API 请求变快,也不会让 setTimeout 立刻执行。它只是语法糖,底层仍是事件循环和微任务队列。你写的“看起来像同步”的代码,执行时依然受制于网络延迟、I/O 耗时等现实约束。
- await 后面如果不是 Promise,会被自动转成
Promise.resolve(value),所以await 123是合法的,但没实际意义 - 想“真正同步”执行耗时操作?JS 里没有(除 Web Workers 或 Deno 的某些扩展外),也不该有——这违背单线程非阻塞的设计哲学
基本上就这些。async/await 是组织异步逻辑的利器,不是魔法开关。用对了,代码清爽;用错了,反而掩盖回调地狱的本质问题。











