适当使用ES6生成器和分页

vin*_*501 6 javascript pagination ecmascript-6 es6-promise

我一直在考虑这个问题,我似乎无法找到一个合理的解决方案来解决这个问题.问题陈述很简单 - 编写一个懒惰地对远程数据集进行分页的生成器.为简化起见,理想情况下,我希望我的库用户可以看到:

for (var user of users()) { 
  console.log(user); 
}
Run Code Online (Sandbox Code Playgroud)

我似乎无法让发电机工作.我认为像这样的逻辑可行,但我无法弄清楚如何实现它.

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

我确定我在想这里有什么问题,但是我似乎找不到任何使用像这样的生成器的人的例子(大多数人使用静态数据或人们做类似的东西async(function*(){...})不完全是什么我希望这样做.)这里的重要部分是我希望最终用户能够如上所述使用数据.

-Vince

T.J*_*der 5

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

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

根据当前的提议,使用异步生成器的代码看起来像:

for (var user on users()) { 
  console.log(user); 
}
Run Code Online (Sandbox Code Playgroud)

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