有没有一种方法可以在不使用while循环的情况下获取异步js生成器函数的返回值

问题描述 投票:0回答:2

我有一个异步生成器函数,我只想获取其返回值,而无需多次调用 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 循环?

javascript typescript
2个回答
0
投票

除了创建一个函数来帮你清理东西之外,你无能为力。不过,您可以使用

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) {}
}

0
投票

为了真正保存并返回生成器的返回值,你必须这样做:

async function getReturnValue(generator) {
  do {
    const { value, done } = await generator.next();
    if (done) return value;
  } while (true)
}

正如 @CMCDragonkai 指出的,@Tim 的答案在这种情况下没有帮助——它丢弃了我们需要的返回值。

© www.soinside.com 2019 - 2024. All rights reserved.