当使用
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
的简单性?
简而言之,您应该使用
yield
值,并且仅使用 return
作为迭代器的返回值。
生成器函数返回一个遵守迭代器协议的对象。以下是 MDN 文档中的相关内容:
可选done
如果迭代器能够生成序列中的下一个值,则为 false 的布尔值。 (这相当于完全不指定done属性。)如果迭代器已完成其序列,则值为 true。在这种情况下, value 可选地指定迭代器的返回值。
可选value
迭代器返回的任何 JavaScript 值。当 did 为 true 时可以省略。
一旦 for ... of
为
done
,true
循环就会退出:
当迭代器完成时,for...of循环退出(next()结果是一个带有done: true的对象)
因此,您的最终值包含在生成器函数的最终响应中,但被 for 循环忽略。再次调用
next()
将返回 undefined
的值,因为生成器已经完成。