4

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

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

4

2 回答 2

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();

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

于 2014-01-02T19:22:27.077 回答
3

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

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

节点和每晚:

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

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}
于 2014-01-16T15:46:04.990 回答