我有以下代码:

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;
}

For aWait循环的输出如下所示:

{ part: 1 }

我还希望获得返回值(在本例中为2).如何在循环内部或外部获取值?

已try 在网上查找,但一无所获.

推荐答案

当您在生成器或BLOG生成器中使用return时,它会在结果对象上设置value的值,以表示donetrue.但是for-offor-await-of并不运行结果对象的循环体,其中done为true.下面是一个简单的例子:

<script type="module">
// Note: Using an async iterator even though we never await
// because the OP's code is async
async function* example() {
    yield 1;
    return 2;
}

for await (const x of example()) {
    console.log(x);
}
</script>

(Sadly, the "JavaScript" panel in Stack Snippets can't be run as a module, and I wanted to use top-level 100, so I had to put the JavaScript in the "HTML" panel instead.)

请注意,只显示了1个.(for-await-of也是如此.)

您至少有两个 Select :

1.将return 2更改为yield 2,这样生成器在生成2的时候还不会"完成",如下所示:

<script type="module">
// Note: Using an async iterator even though we never await
// because the OP's code is async
async function* example() {
    yield 1;
    yield 2; // `yield` instead of `return`
}

for await (const x of example()) {
    console.log(x);
}
</script>

2.更改代码以直接使用迭代器,而不是使用for-await-of.

<script type="module">
   // Note: Using an async iterator even though we never await
   // because the OP's code is async
   async function* example() {
       yield 1;
       return 2;
   }
   
   const it = example();
   let r;
   while (!(r = await it.next()).done) {
       console.log(r.value);
   }
   console.log(r.value);
   </script>

在这两种情况下,您现在看到的是12.

Javascript相关问答推荐

Next.js Next/Image图像隐含性有任何类型-如何修复?

RxJS setTimeout操作符等效

使用JavaScript单击上一个或下一个特定按钮创建卡滑动器以滑动单个卡

具有相同参数的JS类

有什么(最佳)方法可以从模块中获取脚本模块的多姆元素吗?

node TS:JWT令牌签名以验证客户端和后台问题之间的身份验证

在页面上滚动 timeshift 动垂直滚动条

在grafana情节,避免冲突的情节和传说

Chart.js 4.4.2,当悬停在一个数据点上时,如何在工具提示中拥有多个数据点/标签?

无法从NextJS组件传递函数作为参数'

加载背景图像时同步旋转不显示的问题

Webpack在导入前混淆文件名

VSCode中出现随机行

如何为仅有数据可用的点显示X轴标签?

使用可配置项目创建网格

表单数据中未定义的数组键

$GTE的mongoose 问题

Chrome上的印度时区名S有问题吗?

如何在preLoad()中自定义p5.js默认加载动画?

如何使用Angular JS双击按钮