gpt4 book ai didi

Javascript 异步生成器改变生成值的类型?

转载 作者:行者123 更新时间:2023-12-01 00:36:43 26 4
gpt4 key购买 nike

所以我有一些生成器方法,它通过调用另一个方法来获取数据,该方法返回分页数据。该生成器迭代最新的缓冲区并生成每个项目,直到不再有可获取的数据为止。

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 类。但是,如果我等待来自生成器方法的下一个值,则它生成的数据将无法访问附加到Notification对象的任何方法或getter。

当这些数据从生成器返回时发生了什么变化?

最佳答案

您没有正确使用异步生成器,但在我们开始之前,让我们稍微清理一下实现:

async function* paginated_generator(source, opts = {}) {
let buffer = await source(opts)

while (true) {
yield * buffer.items

if (!buffer.paging.next) return

buffer = await source({ ...opts, next: buffer.paging.next })
}
}

当您调用异步生成器函数时,它会返回一个异步生成器对象,该对象同时实现异步迭代器和异步可迭代协议(protocol)。

生成器函数和迭代协议(protocol)的异步和同步对应部分的语法和协议(protocol)之间存在一些差异:

根据您提供的上下文,您的用法(可能)应如下所示:

const Notification = require('./Notification')

async* notifications_paginated (opts = {}) {
const instance = this || opts.instance
const gen = paginated_data(`${instance.api}/news/my`, {
limit: opts.limit || instance.paginated_size,
key: 'news',
prev: opts.prev,
next: opts.next,
headers: instance.headers
})

for await (const item of gen) {
yield new Notification(item)
}
}

然后您可以使用您的notifications_paginated()作为 Notification 的异步迭代器或异步迭代器对象。

如果您尝试缓冲 notifications_paginated() 中的所有项目在返回之前,那么您的 API 可能根本不使用分页,因为缓冲项目首先就违背了分页的目的。

关于Javascript 异步生成器改变生成值的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58070847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com