如何在 for wait...of 之后访问异步生成器中的最后一个值?

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

当使用

for await...of
迭代异步生成器时,最终值(
return
值)似乎已被消耗并且之后无法访问。这是一个最小的例子:

async function* exampleGenerator() {
  yield 1;
  yield 2;
  return 3; // Final value
}

async function main() {
  const generator = exampleGenerator();

  for await (const value of generator) {
    console.log(value); // Logs 1, 2
  }

  const final = await generator.next();
  console.log(final.value); // undefined, expected 3
}

main();

使用

3
后如何获取最终值(
for await...of
)?有没有一种方法既能检索它又不失
for await...of
的简单性?

javascript async-await generator yield for-await
1个回答
0
投票

简而言之,您应该使用

yield
值,并且仅使用
return
作为迭代器的返回值。

说明

生成器函数返回一个遵守迭代器协议的对象。以下是 MDN 文档中的相关内容:

done
可选
如果迭代器能够生成序列中的下一个值,则为 false 的布尔值。 (这相当于完全不指定done属性。)

如果迭代器已完成其序列,则值为 true。在这种情况下, value 可选地指定迭代器的返回值。

value
可选
迭代器返回的任何 JavaScript 值。当 did 为 true 时可以省略。

一旦 for ... of

done
true
 循环就会退出:

当迭代器完成时,for...of循环退出(next()结果是一个带有done: true的对象)

因此,您的最终值包含在生成器函数的最终响应中,但被 for 循环忽略。再次调用

next()
将返回
undefined
的值,因为生成器已经完成。

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