正确使用 ES6 生成器和分页

Proper usage with ES6 generators and pagination

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

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*(){...}) 这不是我想要做的)。这里的重要部分是我希望最终用户能够如上所述使用数据。

-文斯

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

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

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

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

(注意 on 而不是 inof。)但这很可能会改变。