6

我一直在考虑这个问题,我似乎无法想出一个合理的解决方案来解决这个问题。问题陈述很简单 - 编写一个生成器,它将延迟分页远程数据集。为了简化事情,这是我希望我的图书馆的用户看到的理想情况:

for (var user of users()) { 
  console.log(user); 
}

我似乎无法让发电机工作。我在想这样的逻辑会起作用,但我不知道如何实现它。

function* users() {
  while (canPaginate) {
    yield* getNextPageOfUsers() // This will need to return an array of users from an http request
  }
}

我确定我在这里想出了点问题,但我似乎找不到任何人使用这样的生成器的例子(大多数人将它们与静态数据一起使用,或者人们在做类似的事情async(function*(){...}),这并不完全是什么我想做)。这里的重要部分是我希望最终用户能够使用上述数据。

-文斯

4

1 回答 1

5

生成器实际上是暂停并返回给调用者的函数。但是当被调用时,它们必须同步地返回一个值或完成。因此它们不能返回异步操作的结果,原因与普通函数不能返回异步操作的结果相同。

正如 Benjamin 所指出的,有一个异步生成器的 ES7 提案可以让他们这样做,但那是 ES7,所以在这一点上显然是未来。消费语法也受到影响(可以理解;对于编写调用的人来说,知道什么时候异步是很重要的,我们不能让正常的函数在它们不同步的时候看起来是同步的)。

根据当前的提议,您使用异步生成器的代码将类似于:

for (var user on users()) { 
  console.log(user); 
}

(注意on代替inor of。)但这很可能会改变。

于 2015-01-09T18:17:35.427 回答