简单实现async/await
async/await 关键字是 ES7 的新特性,是 Generator 的语法糖,通过这种方法我们可以使用同步的方式来编写异步代码
通过 babel 将
1 | async function test() { |
转为 ES5 语法,结果如下:
1 | function (module, exports, __webpack_require__) { |
可以看到,将 async/await 代码转换为 ES5 代码需要两步,先将其转换为 Generator 的形式,在使用 ES5 实现 Generator
async/await转换为Generator
可以这样模拟
1 | function myAsync(generateFn) { |
ES5实现Generator
典型的生成器如下
1 | function* fn() { |
使用 babel 转换后核心部分如下
1 | var _marked = /*#__PURE__*/regeneratorRuntime.mark(fn); |
可以看到,核心的函数部分被编译成了一个包含若干个 case 的 switch 代码块,整个代码块被regeneratorRuntime.wrap
包裹住,regenerator 是 facebook 开源的用于将 Generator 语法转换为 ES5 的工具,通过这个工具可以和编译后的代码块模拟 generator
根据编译后的 switch 代码块,我们可以写一个简单的函数来模拟 regenerator
1 | function generator(cb) { |
简单测试可以看到
1 | function test() { |