Существует предложение о введении стиля С# async-await
. Я знаю, что Babel.js переводит ES6 в ES5, но есть ли способ сделать его переадресацией async-wait до ES5
?
Transpile Async Ожидание предложения с Babel.js?
Ответ 1
Babel v6
Что касается Babel v6, то Babel больше не содержит трансформаторов. Вы должны явно указать любую функцию, которую вы хотите преобразовать.
Предустановки - среда без ES2015
Самый быстрый способ получить эту работу - использовать пресеты, которые уже содержат набор плагинов, необходимых для преобразования ES2015 и новых предложений. Для async
вам понадобятся предварительные es2015
и es2017
и плагин runtime
(не забудьте установить время babel-runtime
как описано в документации):
{
"presets": [
"es2015",
"es2017"
],
"plugins": [
"transform-runtime"
]
}
Предустановки - среда ES2015
Если вы запускаете код в среде, поддерживающей ES2015 (более конкретно, генераторы и обещания), тогда вам нужно только установить es2017:
{
"presets": [
"es2017"
]
}
изготовленный на заказ
Чтобы преобразовать только функции async
, вам понадобятся следующие плагины.
syntax-async-functions
необходимы в любом случае для возможности синтаксического анализа асинхронных функций
Чтобы запустить функцию async, вам нужно либо использовать
-
transform-async-to-generator
: Преобразуетasync
функцию в генератор. Это будет использовать "совместную" реализацию Babel. -
transform-async-to-module-method
: также преобразует функциюasync
в генератор, но передает его модулю и методу, указанным в конфигурации вместо собственного метода Babel. Это позволяет использовать внешние библиотеки, такие какbluebird
.
Если ваш код работает в среде, поддерживающей генераторы, то ничего не остается. Однако, если целевая среда не поддерживает генераторы, вам также придется преобразовать генератор. Это делается с помощью transform-regenerator
. Это преобразование зависит от функций времени выполнения, поэтому вам также понадобится transform-runtime
Babel (+ пакет babel-runtime
).
Примеры:
Асинхронный генератор
{
"plugins": [
"syntax-async-functions",
"transform-async-to-generator"
]
}
Асинхронный метод
{
"plugins": [
"syntax-async-functions",
["transform-async-to-module-method", {
"module": "bluebird",
"method": "coroutine"
}]
]
}
Асинхронный генератор + регенератор
{
"plugins": [
"syntax-async-functions",
"transform-async-to-generator",
"transform-regenerator",
"transform-runtime"
]
}
Babel v4 и старше
Да, вы должны включить экспериментальные трансформаторы. Вавилон использует регенератор.
Применение
$ babel --experimental
babel.transform("code", { experimental: true });
Ответ 2
Это решение, возможно, изменилось с тех пор (25 февраля Felix Kling) или, возможно, существует еще один способ использования async.
Что сработало для нас, так это запустить Babel так
$ npm install babel-runtime
$ babel inputES7.js -o outputES5.js --optional runtime
Ответ 3
Я получил эту работу сегодня, выполнив дополнительную npm install babel-preset-stage-0
и используя ее как
var babel = require("babel-core");
var transpiled = babel.transform(code, { "presets": ["stage-0"] });
См
Ответ 4
Возможно, еще более современное; просто поместите материал Babel в отдельный файл:
'use strict';
require('babel/register'); // Imports babel - auto transpiles the other stuff
require('./app'); // this is es6 - gets transpiled
Подробнее см. мой код how-can-i-use-es2016-es7-async-await-in-my-acceptance-tests-for-a-koa-js-app.
Ответ 5
Утвержденный ответ кажется устаревшим. Экспериментальный флаг устарел в пользу этапа.
http://babeljs.io/blog/2015/03/31/5.0.0/#experimental-option
Использование
$ babel --stage 0
babel.transform("code", { stage: 0 });
Этап 0
- es7.classProperties
- es7.comprehensions
Этап 1
- es7.asyncFunctions
- es7.decorators
- es7.exportExtensions
- es7.objectRestSpread
Этап 2 (этап 2 и выше включены по умолчанию)
- es7.exponentiationOperator