如何声明异步生成器函数

8

我正在尝试在Node.js中创建异步生成器函数,但似乎不可能。

我的Node.js版本: 7.6.0。

我的代码:

async function* async_generator(){
  for(let i = 0; i < 10; i++){
    yield await call_to_async_func(i);
  };
}

我遇到的错误:

在此输入图片描述

有人知道这是什么问题吗?为什么我不能单独创建异步生成器函数,而我可以单独创建生成器函数或异步函数?


据我所知,截至ES2018,异步生成器还不存在。 - Ry-
有一个提案(这里)但已经被撤回。 - robertklep
2个回答

8

它确实存在,并且有效,但目前它在一个名为"harmony"的标志后面。

example.js

async function* async_generator() {
  for (let i = 0; i < 10; i++) {
    yield await new Promise(r => setTimeout(_ => r("hello world"), 100))
  };
}

async function main(){
  for await (let item of async_generator()){
    console.log(item);
  }
}

main().catch(console.log);

在(node v8.5.0)上运行(在我的情况下有效)

node --harmony-async-iteration example.js

请注意,该提案仍处于第三阶段,如果您想在浏览器中使用它,则可能还需要使用TypeScript或Babel进行转译。
更新:
自Node 9起,异步生成器已经被分阶段。您可以简单地使用“--harmony”启用它。

2
使用 Node 10,它们现在默认已启用。 - Markus Madeja

1

在Node.js中没有异步生成器函数。

不过,他们仍在研究其语义,可以参考异步迭代提案


1
这个答案已经不再相关了,因为ES6中的异步生成器已经成为标准。 - gyo
@gyo 目前为止,这个答案仍然是最新的,异步生成器仍处于上述第三阶段草案中。Promise 已经成为 ES6 的标准,async/await 成为 ES8 的标准。 - Bergi
没错,这绝对还不是“标准”,但生成器已被所有最近的浏览器(除了IE,Edge有限支持)和最新版本的Node(当前v10)支持。 - gyo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接