Transpile Async等待Babel.js的提案?

tld*_*ldr 56 javascript async-await babeljs ecmascript-next

有一个引入C#风格的建议async-await.我知道Babel.js将ES6转换为ES5,但有没有办法让它变得异步 - 等待到ES5

Fel*_*ing 99

巴别塔v6

截至Babel v6,Babel不再包含任何变形金刚.您必须明确指定要转换的任何要素.

预设 - 非ES2015环境

实现这一目标的最快方法是使用已包含转换ES2015和更新提案所需的插件集的预设.因为async,您将需要es2015es2017预设和runtime插件(不要忘记babel-runtime按照文档中的描述安装):

{
  "presets": [
    "es2015",
    "es2017"
  ],
  "plugins": [
    "transform-runtime"
  ]
}
Run Code Online (Sandbox Code Playgroud)

预设 - ES2015环境

如果您在支持ES2015的环境(更具体地说,生成器和Promises)中运行代码,那么您只需要es2017预设:

{
  "presets": [
    "es2017"
  ]
}
Run Code Online (Sandbox Code Playgroud)

习惯

要仅转换async函数,您需要以下插件.

syntax-async-functions 在任何情况下都需要能够解析异步函数

运行异步功能,您需要使用

  • transform-async-to-generator:将async函数转换为生成器.这将使用Babel自己的"共同例程"实现.
  • transform-async-to-module-method:还将async函数转换为生成器,但将其传递给配置中指定的模块和方法,而不是Babel自己的方法.这允许您使用外部库,例如bluebird.

如果您的代码在支持生成器的环境中运行,那么就没有什么可做的了.然而,如果目标环境并不能支持发电机,你也将有改造发电机.这是通过transform-regenerator变换完成的.此转换取决于运行时函数,因此您还需要Babel的transform-runtime转换(+ babel-runtime包).

例子:

异步到发电机

{
  "plugins": [
    "syntax-async-functions",
    "transform-async-to-generator"
  ]
}
Run Code Online (Sandbox Code Playgroud)

异步到模块方法

{
  "plugins": [
    "syntax-async-functions",
   ["transform-async-to-module-method", {
     "module": "bluebird",
     "method": "coroutine"
   }]
  ]
}
Run Code Online (Sandbox Code Playgroud)

异步到发电机+再生器

{
  "plugins": [
    "syntax-async-functions",
    "transform-async-to-generator",
    "transform-regenerator",
    "transform-runtime"
  ]
}
Run Code Online (Sandbox Code Playgroud)

Babel v4及更早版本

是的,你必须启用实验变压器.巴别塔使用再生器.

用法

$ babel --experimental
Run Code Online (Sandbox Code Playgroud)
babel.transform("code", { experimental: true });
Run Code Online (Sandbox Code Playgroud)

  • 如链接所示,您现在必须按阶段或变换器设置:babel.transform("code",{optional:["es7.asyncFunctions"]}); (7认同)

Tim*_*Tim 6

自(2月25日Felix Kling)以来,这个解决方案可能已经发生了变化,或者可能还有不止一种方法可以使用异步等待.

对我们有用的是像这样运行Babel

$ npm install babel-runtime
Run Code Online (Sandbox Code Playgroud)
$ babel inputES7.js -o outputES5.js --optional runtime
Run Code Online (Sandbox Code Playgroud)