gpt4 book ai didi

javascript - 生成器可以使用异步函数吗?

转载 作者:行者123 更新时间:2023-11-30 09:20:10 24 4
gpt4 key购买 nike

我正在从后端服务获取数据,一次获取 20 个结果。我想隐藏这个实现细节并创建一个生成器,只要我需要它们(当它们可用时)就会一直返回记录。

简单的实现:

function* getEndlessRecords(fetchingFunction) {
const batchSize = 20;

// endless loop:
for (let offset = 0; true; offset += batchSize) {
fetchingFunction(offset, batchSize)
.then(records => {
for (let i=0; i < records.length; i++) {
yield records[i]; // THIS DOESN'T WORK!!!
}
})
}
}

(可能有拼写错误 - 这是简化的代码)

我明白为什么这不起作用(yield 对最内层函数有效),但是我似乎找不到围绕异步函数创建生成器的好方法。

生成器是否可以使用异步函数的输出?

最佳答案

从 ES2018 开始,您可以使用异步生成器函数:

async function* getEndlessRecords(fetchingFunction) {
const batchSize = 20;

// endless loop:
for (let offset = 0; true; offset += batchSize) {
const records = await fetchingFunction(offset, batchSize);
for (let i=0; i < records.length; i++) {
yield records[i];
}
}
}

您将在 async 中使用它功能使用for-await-of (不是 for-of ):

for await (const value of getEndlessRecords(/*...*/)) {
// Do something with `value`
}

...或者只是调用它的 next方法和等待结果:

let g = getEndlessRecords(/*...*/);
let result;
while (!(result = await g.next()).done) {
console.log(result.value);
}

...或者当然,在非 async 中功能,你会使用then关于 g.next() 的结果.

在 ES2018 的异步生成器函数语法之前,您必须手动编写生成器而不是使用 function*句法。可以说正确地这样做(不允许对%GeneratorPrototype% 进行任何扩展)是相当容易的。正确地这样做是相当尴尬的,因为 %GeneratorPrototype% 没有可公开访问的符号,您必须去发现它。

关于javascript - 生成器可以使用异步函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52275357/

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