异步生成器可以在babel节点上运行,但是无法使用babel-register或build

时间:2017-01-21 22:27:24

标签: javascript ecmascript-6 babeljs babel-node babel-cli

使用babel-node我能够运行以下代码



function timeout(ms = 100) {
  return new Promise(resolve => {
    let id = setTimeout(() => {
                        clearTimeout(id)
    resolve(ms)
  }, ms)
})
}

async function* worker(limit = 10) {
  async function fetch() {
    return await timeout(Math.random() * 1000)
  }

  let low = 0;
  while (low++ < limit) yield await fetch()
}

async function run() {
  const gen = worker(5)
  const results = [];
  for await (const res of gen) {
    console.log('working')
    results.push(res)
  }

  return 'done'
}

run().then(res => console.log(res)).catch(err => console.error(err))
&#13;
&#13;
&#13;

不在这里工作,但适用于在线Babel REPL

当我通过babel-node运行它时,如:

babel-node src/script.js

但是当我构建并运行它时,它会失败:

babel src/script.js --out-file dist/script.js
node dist/script.js

并给我

TypeError: iterable[Symbol.iterator] is not a function

使用babel-register也失败了同样的错误:

node -r babel-register -r dotenv/config src/script.js

我当前的.babelrc看起来像是

{
    "plugins": ["transform-strict-mode", "transform-async-generator-functions"],
    "presets": ["es2015-node6", "stage-2"]
}

使用es2015代替es2015-node6没有任何好处

当我查看用于babel-node here的默认插件和预设时,看起来他们已经空了

我错过了什么?

1 个答案:

答案 0 :(得分:4)

除了处理运行时转换之外,

babel-node(和在线REPL)也是requires babel-polyfill。您应该在程序的入口点npm i -S babel-polyfill然后import 'babel-polyfill';(或者在您的示例中,将-r babel-polyfill添加到您的node args)。