加载中...
async/await 是 ES2017 引入的语法糖,将 Promise 链改写成看起来像同步代码的形式,大幅降低异步逻辑的阅读与调试难度,现已是 JavaScript 异步编程的首选写法。
| 正式引入 | ECMAScript 2017(ES8) |
| Node.js 原生支持 | v7.6.0,2017 年 2 月 |
| 底层机制 | Promise + Generator 状态机 |
async 函数本质上是返回 Promise 的函数;await 暂停当前 async 函数的执行,等待后面的 Promise 落定,再恢复执行并拿到值。编译器(Babel、TypeScript)会将 async/await 转译为基于 Generator + Promise 的状态机,这也是为什么 ES2015 的 Generator 被视为 async/await 的「前身」。Node.js 从 7.6 版本(2017 年)起原生支持不加 flag,此后成为 Node 异步编程标准。[1]
顺序 await 杀死并发:const a = await fetch(url1); const b = await fetch(url2) 是串行的,应改为 const [a, b] = await Promise.all([fetch(url1), fetch(url2)])。错误处理:不加 try/catch 的 await 若 reject 会抛出未捕获异常;可用 to(promise) 工具函数返回 [error, data] 元组,参考 Go 风格。for…of 中的 await 是顺序执行,forEach 里的 await 则因 forEach 不等待 Promise 而失效——这个坑让不少初学者困扰。
| 正式引入 | ECMAScript 2017(ES8) |
| Node.js 原生支持 | v7.6.0,2017 年 2 月 |
| 底层机制 | Promise + Generator 状态机 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧