【发布时间】:2020-01-24 00:28:48
【问题描述】:
所以我有一些生成器方法,它通过调用另一个方法来获取数据,该方法返回分页数据。此生成器迭代最近的缓冲区和yields 每个项目,直到没有更多可获取的数据。
async function* paginated_generator(source, opts = {}) {
buffer = await source(opts)
while (true) {
for (let item of buffer.items) {
yield item
}
if (!buffer.paging.next) {
break
}
buffer = await source({ ...opts, next: buffer.paging.next })
}
}
在这种情况下,它正在调用的方法如下所示,并为每条数据构造一个新的Notification 实例。
async notifications_paginated(opts = {}) {
let Notification = require('./Notification')
let instance = this || opts.instance
let data = await paginated_data(`${instance.api}/news/my`, {
limit: opts.limit || instance.paginated_size,
key: 'news',
prev: opts.prev,
next: opts.next,
headers: instance.headers
})
data.items = data.items.map((item) => new Notification(item))
return data
}
当我直接从此方法获取数据,或者在生成器生成之前在生成器中插入类似console.log(item.some_getter) 的内容时,我可以看到该对象是Notification 类的一个实例。但是,如果我 await 生成器方法的下一个值,则它产生的数据无法访问附加到 Notification 对象的任何方法或 getter。
当这个数据从生成器返回时发生了什么变化?
【问题讨论】:
-
methods.paginated_data()是对paginated_generator()的引用吗?目前还不是很清楚。 -
@PatrickRoberts 是的。它们在不同的文件中,正在导入方法。
-
您是否只是错过了它具有
{ value: object, done: bool }样式的事实。对于您的生成器,我认为与其使用 for 循环,不如返回yield* buffer.items -
@DieKaffir 这没有意义。对
paginated_generator(…)的调用会返回一个异步生成器实例,它可以(异步)迭代但不能awaited。这不是一个通过包含.items数组属性的值来实现的承诺。
标签: javascript node.js generator