正确使用 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
而不是 in
或 of
。)但这很可能会改变。
我一直在考虑这个问题,但我似乎无法想出一个合理的解决方案来实现这个目标。问题陈述很简单 - 编写一个将对远程数据集进行惰性分页的生成器。为了简化事情,这就是我希望我的图书馆的用户看到的理想情况:
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
而不是 in
或 of
。)但这很可能会改变。