禁用使用babel-preset-env进行的承诺转译?

时间:2018-10-08 14:47:55

标签: javascript promise babel

我正在使用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转换所有内容但保留承诺?

2 个答案:

答案 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支持异步/等待和箭头功能本机。