在Javascript中重新启动生成器

时间:2014-01-02 19:10:14

标签: javascript node.js generator ecmascript-harmony

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

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

2 个答案:

答案 0 :(得分:5)

你没有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();

另一种选择是设计你的发电机,使它永远不会完成,所以你可以继续永远地调用它。如果没有看到你正在谈论的代码,很难提出建议。

答案 1 :(得分:3)

有点晚了,但这只是一个FYI。

目前,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

节点&amp;每晚:

现在,使用生成器的真实语法 - 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}