async/await 的核心作用是让异步代码更直观,避免回调嵌套与 promise 链冗长;async 函数自动返回 promise,await 暂停函数执行等待 promise 完成,支持 try/catch 错误处理,不阻塞线程且需注意串行性能问题。

async 和 await 的核心作用是让异步代码写起来像同步代码一样直观,避免回调嵌套和 Promise 链的冗长写法,同时保持 JavaScript 单线程异步执行的本质。
async 函数:声明一个会返回 Promise 的函数
在函数声明前加 async,该函数就自动返回 Promise。即使 return 一个普通值,也会被包装成 resolved 的 Promise;抛出错误则等价于返回 rejected 的 Promise。
- 不用手动 new Promise 或调用 resolve/reject
- 可以直接 return 数据,无需 .then(() => data)
- 内部可混合使用同步逻辑、await 表达式和 try/catch
await:暂停函数执行,等待 Promise 完成
await 只能在 async 函数内部使用,它会让 JS 引擎暂停当前函数(不阻塞主线程),等右侧的 Promise settle 后再继续执行。await 后面可以是 Promise,也可以是任意值(此时直接返回该值)。
- await fetch('/api/user') 等价于 fetch(...).then(res => res)
- 多个 await 默认串行执行;如需并发,可用 Promise.all([await p1, await p2]) 改为 Promise.all([p1, p2])
- await 后建议加 try/catch,捕获 rejected Promise 的错误
错误处理:用 try/catch 替代 .catch()
Promise 链中常靠 .catch() 捕获错误,而 async/await 中可直接用标准 try/catch 语句,逻辑更贴近同步代码习惯。
- try { const data = await apiCall(); } catch (err) { console.error(err); }
- 错误类型和堆栈信息与 Promise.reject() 一致,调试体验更好
- 避免在每个 await 后单独写 .catch,减少重复模板代码
常见误区与注意事项
async/await 不是语法糖,也不改变事件循环机制。它只是 Promise 的更简洁接口,理解底层仍是关键。
- await 不会“阻塞线程”,只是暂停函数执行,JS 仍可处理其他任务
- 不要在循环中无意识地串行 await(如 for...of 里 await),可能造成性能瓶颈
- 顶层 await 可用于模块级异步初始化(ES2022+),但暂不支持普通脚本全局作用域










