Transpile Async Await propuesta con Babel.js?


Existe una propuesta para introducir el estilo C# async-await. Conozco a Babel.js transpila ES6 a ES5, pero ¿hay alguna manera de hacerlo transpilar async-await a ES5?

Author: Felix Kling, 2015-02-25

5 answers

Babel v6

A partir de Babel v6, Babel ya no contiene ningún transformer. Debe especificar explícitamente cualquier característica que desee transformar.

Presets-entorno no ES2015

La forma más rápida de hacer que esto funcione es usar presets que ya contienen el conjunto de complementos necesarios para transformar ES2015 y propuestas más recientes. Para async, tendrá la es2015 y es2017 ajustes preestablecidos y la runtime plugin (no olvides instalar babel-runtime como se describe en la documentación):

{
  "presets": [
    "es2015",
    "es2017"
  ],
  "plugins": [
    "transform-runtime"
  ]
}

Presets-entorno ES2015

Si ejecuta el código en un entorno que admite ES2015 (más específicamente, generadores y Promesas), todo lo que necesita es el preset de es2017:

{
  "presets": [
    "es2017"
  ]
}

Custom

Para transformar solo las funciones async, necesitará los siguientes complementos.

syntax-async-functions es necesario en todos los casos para poder analizar async funciones

Para que ejecute la función async, debe usar

  • transform-async-to-generator: Convierte la función async en un generador. Esto utilizará la propia implementación de "co-rutina" de Babel.
  • transform-async-to-module-method: También convierte la función async en un generador, pero la pasa al módulo y método especificado en la configuración en lugar del método propio de Babel. Esto le permite utilizar bibliotecas externas como bluebird.

Si su código se ejecuta en un entorno que admite generadores, entonces no queda nada por hacer. Sin embargo, si el entorno de destino no admite generadores , también tendrá que transformar el generador. Esto se hace a través de la transform-regenerator transformar. Esta transformación depende de las funciones de tiempo de ejecución, por lo que también necesitará las de Babel transform-runtime transform (+el paquete babel-runtime).

Ejemplos:

Asíncrono a generator

{
  "plugins": [
    "syntax-async-functions",
    "transform-async-to-generator"
  ]
}

Método asincrónico al módulo

{
  "plugins": [
    "syntax-async-functions",
   ["transform-async-to-module-method", {
     "module": "bluebird",
     "method": "coroutine"
   }]
  ]
}

Asíncrono a generador + regenerador

{
  "plugins": [
    "syntax-async-functions",
    "transform-async-to-generator",
    "transform-regenerator",
    "transform-runtime"
  ]
}

Babel v4 y anteriores

Sí, tienes que activar los transformadores experimentales. Babel utilizaregenerador .

Uso

$ babel --experimental

babel.transform("code", { experimental: true });
 99
Author: Felix Kling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-09 16:32:48

Esta solución puede haber cambiado desde (Feb 25 Felix Kling) o tal vez todavía hay más de una forma de usar async await.

Lo que funcionó para nosotros fue ejecutar Babel así

$ npm install babel-runtime

$ babel inputES7.js -o outputES5.js --optional runtime
 6
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-30 17:17:21

Conseguí que esto funcionara a partir de hoy haciendo un npm install babel-preset-stage-0 adicional y usándolo como

var babel = require("babel-core");
var transpiled = babel.transform(code, { "presets": ["stage-0"] });

Véase

 4
Author: Tobi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-08 12:51:18

Quizás aún más actualizado ahora; simplemente ponga las cosas de babel en un archivo separado:

'use strict';

require('babel/register'); // Imports babel - auto transpiles the other stuff
require('./app'); // this is es6 - gets transpiled

Vea mi código en how-can-i-use-es2016-es7-async-await-in-my-acceptance-tests-for-a-koa-js-app para más detalles.

 2
Author: egeland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-28 01:57:48

La respuesta aprobada parece estar desactualizada ahora. La bandera experimental ha sido obsoleta a favor de stage.

Http://babeljs.io/blog/2015/03/31/5.0.0/#experimental-option

Uso

$ babel --stage 0

babel.transform("code", { stage: 0 });

Etapa 0

  • es7.Classpropiedades
  • es7.comprensiones

Etapa 1

  • es7.asyncFunctions
  • es7.decoradores
  • es7.exportExtensions
  • es7.objectRestSpread

Etapa 2 (La etapa 2 y superior están habilitadas de forma predeterminada)

  • es7.Operador de exponenciación
 2
Author: Matt Dell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-06 14:15:04