适当使用ES6生成器和分页

时间:2015-01-09 17:39:33

标签: javascript pagination ecmascript-6 es6-promise

我一直在考虑这个问题,而我似乎无法想出如何实现这一目标的合理解决方案。问题陈述很简单 - 编写一个懒惰地对远程数据集进行分页的生成器。为简化起见,理想情况下,我希望我的图书馆用户能够看到这一点:

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

-Vince

1 个答案:

答案 0 :(得分:5)

生成器实际上是暂停并回退给其调用者的函数。但是在调用时,它们必须同步要么返回值,要么完成。因此,他们无法返回异步操作的结果,原因与普通函数无法返回异步操作的结果相同。

正如本杰明所指出的那样,asynchronous generators的ES7提案会让他们这样做,但这就是ES7,所以将来这一点显而易见。点。消费语法也受到影响(可以理解;对于编写呼叫的人来说,知道什么时候异步,我们不能正常的功能看起来是同步的,这对他们来说很重要。< / p>

根据当前的提议,使用异步生成器的代码如下所示:

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

(请注意on而不是inof。)但这可能会发生变化。