【问题标题】:Restarting a Generator in Javascript在 Javascript 中重新启动生成器
【发布时间】:2014-01-20 07:39:26
【问题描述】:

在节点(0.11.9,带有--harmony 标志)中,如何在生成器完成后重新启动它?

我试过 generator.send(true); 但它说 send() 方法不存在。

【问题讨论】:

    标签: javascript node.js generator ecmascript-harmony


    【解决方案1】:

    有点晚了,但这只是一个仅供参考。

    目前,send 方法没有在 Node 中实现,而是在 Nightly (FF) 中实现 - 并且只是以某种方式。

    每晚:

    如果您声明您的生成器没有 *,您将获得一个具有send 方法的迭代器:

    var g = function() {
      var val = yield 1; // this is the way to get what you pass with send
      yield val;
    }
    var it = g();
    it.next(); // returns 1, note that it returns the value, not an object
    it.send(2); // returns 2
    

    Node & Nightly:

    现在,使用生成器的真正语法 - function*(){} - 您生成的迭代器将没有 send 方法。但是该行为实际上是在next 方法中实现的。另外,请注意,它从未打算让 send(true); 自动重新启动您的迭代器。您必须测试 yield 返回的值才能手动重新启动它(请参阅链接页面中的示例)。任何值,只要它不是 falsy 值,都可以工作。自己看:

    var g = function*() {
      var val = 1;
      while(val = yield val);
    }
    var it = g();
    it.next(); // {done: false, value: 1}
    it.next(true); // {done: false, value: true}
    it.next(2); // {done: false, value: 2}
    it.next(0); // {done: true, value: undefined}
    

    【讨论】:

    • 很高兴知道,谢谢你解释得这么清楚。 =)
    【解决方案2】:

    您没有restart 生成器。完成后,它就像任何其他功能一样完成了运行。您需要重新创建生成器才能再次运行。

    var count = function*(){ yield 1; return 2;};
    
    var gen = count();
    var one = gen.next();
    var two = gen.next();
    
    // To run it again, you must create another generator:
    var gen2 = count();
    

    另一种选择是设计您的生成器,使其永远不会完成,这样您就可以永远继续调用它。如果没有看到您正在谈论的代码,很难提出建议。

    【讨论】:

    • 有问题的代码有些复杂,但如果有帮助,我可以将您链接到它。我的印象是可以根据this MDN page重新启动发电机。
    • 该示例重新启动 sequence,而不是 generator。该生成器永远不会完成,因为它是一个无限循环。如果这还不足以让您朝着正确的方向前进,请发布您的代码。您调用sendgenerator 分配了什么?
    • 是的,我使用了错误的行话。有没有办法重新启动序列?我正在研究this,特别是在ret.types.REFERENCEtoken.remember 附近。基本上,当迭代正则表达式反向引用时,我试图返回先前生成的生成器,它有点工作,但是当它看到\1 \1 时,生成器无法产生更多结果。令人困惑,我知道......我认为如果我可以重新启动生成器序列,我可以让它工作,因此这个问题。
    猜你喜欢
    • 2020-03-08
    • 1970-01-01
    • 2022-01-17
    • 2021-07-14
    • 1970-01-01
    • 2013-08-14
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多