【问题标题】:Proper usage with ES6 generators and pagination正确使用 ES6 生成器和分页
【发布时间】:2015-03-08 02:29:48
【问题描述】:

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

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

-文斯

【问题讨论】:

  • 我建议澄清这个问题。在对我现在已删除的答案的评论中,您说 “我的问题不是消耗,而是消耗异步数据的生成器的实现”我不相信你 可以 i> 生成器的实现是异步的:当你调用生成器时,它必须返回下一项或什么都不返回,因此不能返回异步值,就像普通函数不能返回异步值一样。跨度>
  • 使用异步生成器是可能的——这些现在都在规范中。
  • 旁注:消费代码肯定也有问题:它正在循环浏览一页用户。要遍历多个页面,您需要一个嵌套循环(一个用于页面,一个用于该页面内的用户)。
  • @BenjaminGruenbaum:酷!在哪里?我在任何地方都没有看到“异步”,但与 Promise 相关(the HTML version,12 月 24 日更新)。
  • 您的问题已被识别,因此 async generators 将被添加到 ECMASCript 7 中 - 危险在于尚无实现支持它,但您可以 use a transpiler like 6to5 使用它:

标签: javascript pagination ecmascript-6 es6-promise


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢!我有一种感觉,我无法让它工作是有原因的!感谢您的精彩解释。
猜你喜欢
  • 1970-01-01
  • 2016-11-04
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 2018-12-03
  • 2016-09-10
  • 1970-01-01
相关资源
最近更新 更多