如何在没有未使用变量的情况下捕获生成器中的产量?[已结束]

How to catch a yield in a generator without having unused variable? [closed]

提问人:Laurent Lyaudet 提问时间:9/6/2023 最后编辑:jonrsharpeLaurent Lyaudet 更新时间:9/6/2023 访问量:44

问:


这个问题是由一个错别字或一个无法再重现的问题引起的。虽然类似的问题可能在这里成为主题,但这个问题的解决方式不太可能帮助未来的读者。

3个月前关闭。

我有一个警告,代码类似于这样:'res' is assigned a value but never used no-unused-vars

function* cancelCredit(action) {
    const res = yield call(/*Nice api call 1*/);
    const res2 =  yield call(/*Nice api call 2*/);
    // Do something with res2
    yield // something
}

如何在没有未使用的变量的情况下隐藏这个生成器函数的第一个,例如?yieldconsole.log(res)

JavaScript 生成器 产量

评论

3赞 jonrsharpe 9/6/2023
只是不分配结果?如果你不需要它,何必呢? 本身就是一个有效的声明。yield call(/* args */);
0赞 Laurent Lyaudet 9/6/2023
但在这种情况下,结果是生成器:)的回报之一。一切都是因为产量在这里有两个含义。
2赞 Evert 9/6/2023
@LaurentLyaudet产量没有 2 个含义。如果删除 ,从此生成器的调用者的角度来看,仍将有 3 个产量。分配 yield 语句的结果不会改变这一点。const res =
1赞 jonrsharpe 9/6/2023
我不清楚你的意思。我的理解是,结果是传递给的任何值,所以如果你不使用该值,你就不能将其分配给标识符。或者,您可以告诉 ESLint 忽略赋值,或者对可以忽略的未使用变量使用模式(例如)。yield ...next_
0赞 Laurent Lyaudet 9/6/2023
谢谢@Evert。我以为它只返回生成器中的第三个产量。如果你能在JS规范中提供正确的参考,我会接受它作为答案:)

答:

1赞 Dimava 9/6/2023 #1

您可以通过使用运算符来忽略任何值:void

void yield call(/*Nice api call 1*/);

(这对于强制所有承诺明确等待或作废的 Eslint 规则特别有用)

但是,您的情况不是您必须这样做的 2.5 种情况之一 - 您可以忽略该值,这是允许的void

yield call(/*Nice api call 1*/);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield

语法

yield
yield expression

参数 expression 可选 通过迭代器协议从生成器函数中产生的值。如果省略,则生成 undefined。

返回值 返回传递给生成器的 next() 方法以恢复其执行的可选值。

注意:这意味着 next() 是不对称的:它总是向当前暂停的 yield 发送一个值,但返回下一个 yield 的操作数。无法检索传递给第一个 next() 调用的参数,因为当前没有暂停的 yield。

评论

0赞 Laurent Lyaudet 9/6/2023
以防万一其他人发现了这个问题,并且有和我一样的心态,并认为发电机只是一种方法,因为这是 90% 的用途。这里的关键点是,yield 表达式可以返回生成器调用者在两个“yield”之间给出的值。在 JS 中,这是通过给 .在 Python 中,您将使用该方法。以下关于 Python 的教程非常适合了解生成器的基本用途:realpython.com/introduction-to-python-generatorsnext()send()