【问题标题】:Find missing yield statements查找缺失的产量语句
【发布时间】:2017-09-26 12:36:39
【问题描述】:

我正在寻找一种方法来查找代码中的位置(例如在 Atom 中使用 jslint 进行验证),其中函数是用 * 定义的,但是在调用它时没有指定“yield”。我经常忘记“屈服”,并且想要一些东西来提醒/验证这一点。有办法吗?原子包可能吗?

举例说明:

let f = function* () {
  yield doAsyncStuff();
  yield doMoreAsyncStuff();
  let res = yield fetchAsyncStuff();
  return res;
}

let caller = function* () {
  yield anotherFunction();
  let res = x(); // <-- here I have missed the yield
}

【问题讨论】:

  • 单元测试,嗯? :)
  • 我觉得像这样的错误比编写测试更容易被发现。此外,我无法计算我在测试时也遇到过多少次。无论如何,无论您在哪里遇到此问题,调试都需要花费时间。

标签: javascript asynchronous yield


【解决方案1】:

Eslint 有一个名为require-yield 的规则,它检测生成器函数中是否没有使用yield 关键字。但是在您的caller 函数中,当调用anotherFunction 时,您已经有一个yield,并且由于在调用x 函数时不使用yield 可能是代码背后逻辑的一部分,因此没有合乎逻辑的方法来检测那里丢失的yield
顺便说一下,这个问题已经讨论过很多了,但不可行:Rule Idea: Ensure yield on call to generator function

【讨论】:

  • 怎么不能使用“yield”成为逻辑的一部分?如果它从未产生过,那么调用该生成器函数有什么意义呢?
  • 函数Andree中的yield。你有yield anotherFunction();。然后在 yield 之后你可以修改一些做其他工作的状态。确实,没有 yield 的生成器函数是没有意义的,并且有 eslint 规则require-yield 。但事实并非如此。
  • @andree 你可能想要保存 x 函数的结果,它可以作为一个简单的变量来执行并行操作,或者其他类型的算法,比如将实际的生成器对象保存在内存并稍后对其进行迭代。
  • @MehranHatami 谢谢,你说得很好。无论如何我可以强制 linter 始终假设我想让步,永远不要为以后的操作留下简单的变量?
  • @andree 我的用例之一是在列表中发送不同的生成器对象,并让调用我的函数的人在需要时决定在我的生成器上使用yield。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多