请谈谈你如何理解 JavaScript 中的 async/await 机制?
考察说明
考查对 JavaScript 异步编程中 async/await 语法糖及其执行机制的理解。
回答思路
- 【回答框架 1】async/await 是基于 Promise 的语法糖,用于以同步方式编写异步代码。async 函数总是返回一个 Promise,其中 return 值会被包装为 resolved Promise,抛出异常则包装为 rejected Promise。
- 【回答框架 2】await 只能在 async 函数内使用,它会暂停当前 async 函数的执行,等待右侧 Promise 状态确定。如果等待的 Promise resolve,await 表达式返回其值;若 reject,则抛出异常,可通过 try/catch 捕获。在事件循环中,await 会让出线程,不阻塞其他任务。
- 【回答框架 3】async/await 使异步代码更易读、更接近同步代码风格,避免了回调地狱和冗长的 Promise 链。与 .then/.catch 相比,错误处理更直观,流程控制也更简单。
- 【回答框架 4】实际使用时需要注意:await 是顺序执行的,若不相关应使用 Promise.all 并行;async/await 只能在支持 Promise 的环境中使用;过度使用可能掩盖并发需求。理解其底层基于 Promise 和微任务队列,有助于排查执行顺序问题。
- 【关键点 1】async 函数返回 Promise,await 用于等待 Promise 并提取结果。
- 【关键点 2】await 会暂停 async 函数执行,但不阻塞事件循环,本质是利用微任务调度。
- 【关键点 3】async/await 是 Promise 的语法糖,不替代 Promise,而是提升可读性和错误处理体验。
- 【关键点 4】多个无关 await 会串行,应使用 Promise.all 进行并行优化。
- 【易错点 1】认为 await 是同步阻塞,实际上它是异步等待,不阻塞主线程。
- 【易错点 2】在非 async 函数中直接使用 await 会导致语法错误。
- 【易错点 3】忽略 async 函数返回的是 Promise,导致外层 .then 或额外包装。