Перезапуск генератора в Javascript

В узле (0.11.9, с --harmony флаг), как перезапустить генератор после его завершения?

Я пытался делать generator.send(true); но он говорит, что метод send() не существует.

2 ответа

Решение

Немного поздно, но это всего лишь К вашему сведению.

На данный момент 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 перезапустить его вручную (см. пример на странице, на которую вы ссылаетесь). Любое значение, если оно не ложное, может работать. Посмотреть на себя:

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}

Ты не 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();

Другой вариант заключается в том, чтобы создать генератор таким образом, чтобы он никогда не заканчивался, поэтому вы можете продолжать вызывать его вечно. Не видя код, о котором вы говорите, трудно делать предложения.

Другие вопросы по тегам