我有一个异步生成器函数,我只想获取其返回值,而无需多次调用 next 。现在我有这样的事情:
async function *getData(): AsyncGenerator<object[], object[]>
{
let results = []
let res = {};
while (true)
{
res = await apiCall(res.next);
results.push(...res.data)
if (!res.next) break;
yield res.data;
}
return results;
}
async function main()
{
const genFn = getData();
while (!(await genFn.next()).done) {}
}
有没有更好/更简洁的方法不需要 while 循环?
除了创建一个函数来帮你清理东西之外,你无能为力。不过,您可以使用
for-await
代替 while 循环。
async function drainAsyncIterable(iterable) {
const iterator = iterable[Symbol.asyncIterator]();
while (!(await iterator.next()).done) {}
}
对
async function drainAsyncIterable(iterable) {
for await (const _ of iterable) {}
}
为了真正保存并返回生成器的返回值,你必须这样做:
async function getReturnValue(generator) {
do {
const { value, done } = await generator.next();
if (done) return value;
} while (true)
}
正如 @CMCDragonkai 指出的,@Tim 的答案在这种情况下没有帮助——它丢弃了我们需要的返回值。