如何从for await循环的异步生成器中获取返回值
如何获取异步生成器的返回值?
我有如下遍历异步生成器的代码:
for await (const part of resolveData(data)) { console.log({part}); }
对应的异步生成器定义:
const resolveData = async function* <T> (data: SomeValue<T>) { if (<expression1>) { if (<expression2>) { console.log("valid"); yield 1; } } return 2; }
当前循环输出为{ part: 1 },但我希望获取生成器的返回值(也就是数字2),请问该怎么在循环内部或外部拿到这个值?
要获取异步生成器的return值,for await...of循环是做不到的——这个循环只会处理生成器yield产出的值,对return的结果会直接忽略。你需要手动迭代生成器的迭代器,直到拿到done: true的结果,此时的value就是生成器的返回值。
具体实现代码如下:
// 先实例化异步生成器 const generator = resolveData(data); let iterResult; // 手动迭代,处理所有yield出来的值 while (!(iterResult = await generator.next()).done) { const part = iterResult.value; console.log({part}); } // 循环结束后,iterResult.value就是生成器的返回值 console.log('生成器返回值:', iterResult.value); // 输出 2
如果不想修改生成器的逻辑,这是最直接的解决方案。要是你可以调整生成器代码,也可以把返回值通过yield产出,但这会改变生成器原本的输出序列,需要根据实际场景判断是否适用。
内容的提问来源于stack exchange,提问作者sss3243
相关产品推荐
相关产品推荐

