Babel将Async/Await函数转换为ES5兼容的代码

打开babel在线编译器

  1. 进入bebel官网babeljs.io/
  2. 点击右上角Try it out

添加async转换插件

  1. 展开左下角的PLUGINS

  2. 点击左下角Add Plugin 按钮

  3. 搜索async

  4. 选择@babel/plugin-transform-async-generator-functions插件

    @babel/plugin-transform-async-generator-functions 是一个 Babel 插件,用于将异步生成器函数转换为 ES5 兼容的代码。

function *

function * 这种声明方式(function关键字后跟一个星号)会定义一个生成器函数(Generator functiob), 它返回一个Generator对象

Generator对象

Generator对象由生成器函数返回, 并且它符合可迭代协议和迭代器协议

Generator是隐藏类iterator的子类

方法

Generator.prototype.next()

Generator实例的next()方法返回一个包含属性done和value的对象。

next()方法可以接收一个参数

Generator.prototype.return()

Generator.prototype.throw()

yield 关键字

yield关键字用于暂停和恢复生成器函数

Async转换结果

  • 转换前
js 复制代码
const fetchData = (data) => new Promise((resolve) => setTimeout(resolve, 1000, data + 1))

const fetchValue = async function () {
    var value1 = await fetchData(1);
    var value2 = await fetchData(value1);
    var value3 = await fetchData(value2);
    console.log(value3)
};

fetchValue();
  • 转换后
js 复制代码
function asyncToGenerator(gen, resolve, reject, _next, _throw, key, arg) {
   try {
    var info = gen[key](arg)
    var value = info.value
   } catch (error) {
    reject(error)
    return
   }

   if (info.done) {
    resolve(value)
   } else {
    Promise.resolve(value).then(_next, _throw)
   }
}

function _asyncToGenerator(fn) {
    return function () {
        var self = this,
        args = arguments
        return new Promise(function(resolve, reject) {
            // 执行传入的生成器函数
            var gen = fn.apply(self, args);
            function _next(value) {
                // 封装generator实例对象的next方法
               asyncToGenerator(gen, resolve, reject, _next, _throw, 'next', value)
                
            }
            function _throw(err) {
                // 封装generator实例对象的throw方法
                asyncToGenerator(gen, resolve, reject, _next, _throw, 'throw', err)
            }
            // 执行generator实例对象的next方法
            _next(undefined) 
        })
    }
}

const fetchData = data => new Promise(resolve => setTimeout(resolve, 1000, data + 1))

const fetchValue = function() {
    var _ref = _asyncToGenerator(function * () {
        var value1 = yield fetchData(1);
        var value2 = yield fetchData(value1);
        var value3 = yield fetchData(value2)
        console.log(value3)
    })
    return function fetchValue() {
        return _ref.apply(this, arguments)
    }
}();

fetchValue()
相关推荐
忠实米线20 分钟前
使用pdf-lib.js实现pdf添加自定义水印功能
前端·javascript·pdf
明辉光焱1 小时前
[Electron]总结:如何创建Electron+Element Plus的项目
前端·javascript·electron
牧码岛1 小时前
Web前端之汉字排序、sort与localeCompare的介绍、编码顺序与字典顺序的区别
前端·javascript·web·web前端
云空2 小时前
《InsCode AI IDE:编程新时代的引领者》
java·javascript·c++·ide·人工智能·python·php
咔咔库奇2 小时前
ES6基础
前端·javascript·es6
bug爱好者2 小时前
如何解决sourcetree 一打开就闪退问题
前端·javascript·vue.js
徐小夕2 小时前
Flowmix/Docx 多模态文档编辑器:V1.3.5版本,全面升级
前端·javascript·架构
迂 幵3 小时前
vue el-table 超出隐藏移入弹窗显示
javascript·vue.js·elementui
上趣工作室3 小时前
vue2在el-dialog打开的时候使该el-dialog中的某个输入框获得焦点方法总结
前端·javascript·vue.js
家里有只小肥猫3 小时前
el-tree 父节点隐藏
前端·javascript·vue.js