我正在使用babel-preset-env
(Babel 6),却找不到如何禁用“承诺”转译的方法。
我尝试使用:
{
"presets": [
[
"env",
{
"exclude": ["transform-async-to-generator", "es6.promise"]
}
]
],
"plugins": [
"transform-object-rest-spread",
"transform-class-properties",
[
"fast-async",
{
"spec": true,
"compiler": { "promises": true, "generators": false }
}
]
]
}
,尽管它不会引发任何错误(与通过无效选项时会发生的错误不同),但仍会将承诺转换为runtimeGenerator
函数。
我如何才能使babel-preset-env转换所有内容但保留承诺?
答案 0 :(得分:2)
好吧,现在有了实际的.babelrc并提到fast-async
,依此类推...像这样的.babelrc似乎足以使用fast-async
代替regenerator-runtime
等。
{
"presets": [
[
"env",
{
"exclude": ["babel-plugin-transform-async-to-generator", "babel-plugin-transform-regenerator"]
}
]
],
"plugins": [
[
"fast-async",
{
"spec": true,
"compiler": { "promises": true, "generators": false }
}
]
]
}
答案 1 :(得分:1)
不应使用int
将承诺转换为任何东西。但是int
/ babel-preset-env
是。您可以看到here in the Babel playground
async
被编译到
await
使用默认的环境设置。如果您将环境字符串更改为const x = () => new Promise((res) => res('hi'));
const y = async () => {
const z = await x();
};
(或者实际上是有趣的'use strict';
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
var x = function x() {
return new Promise(function (res) {
return res('hi');
});
};
var y = function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
var z;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return x();
case 2:
z = _context.sent;
case 3:
case 'end':
return _context.stop();
}
}
}, _callee, undefined);
}));
return function y() {
return _ref.apply(this, arguments);
};
}();
!),则代码会按原样传递,因为Chrome> 60支持异步/等待和箭头功能本机。