Всегда ли первый next () в функции генератора js выполняется до первого выхода? - PullRequest
0 голосов
/ 16 октября 2018

MDN предположил, что «Когда вызывается метод next () итератора, тело функции генератора выполняется до первого выражения yield», и я понимаю этот пример:

function* logGenerator() {
  console.log(0);
  console.log(1, yield);
  console.log(2, yield);
  console.log(3, yield);
}

var gen = logGenerator();

gen.next(); // 0
gen.next('pretzel'); // 1 pretzel
gen.next('california'); // 2 california
gen.next('mayonnaise'); // 3 mayonnaise

Однако я запутался, когда наткнулся на другой пример:

const foo = function*() {
  yield 10;
  yield 20;
};

const bar = foo();
console.log(bar.next()); // {value: 10, done: false}

Если первый next() выполняет только код ДО первого выхода, значение должно быть неопределенным.Как он получает значение WITHIN первого дохода?Я немного запутался здесь.Спасибо за помощь.

1 Ответ

0 голосов
/ 16 октября 2018

Вы можете видеть, что происходит лучше, регистрируя, что генератор выдает каждый раз, а также добавляя значения в выражения yield, чтобы вы могли видеть, что генератор действительно дает (пример MDN не беспокоился об этомпоскольку он никогда не использует полученные значения, он просто демонстрировал, как работает аргумент next()).

Как правило, вы не будете использовать один генератор для получения значений, а также для получения значений через next()аргумент, только один или другой.Если он выдает значения, вы бы использовали yield <expression> как сам по себе оператор (аналогично return), а не внутри выражения.Если он получает значения, вы используете yield без параметра внутри выражения.Но, как вы можете видеть из моего модифицированного примера, базовый механизм допускает и то и другое одновременно.Вам просто нужно следить за запутанным порядком исполнения.

function* logGenerator() {
  console.log(0);
  console.log(1, yield 10);
  console.log(2, yield 20);
  console.log(3, yield 30);
}

var gen = logGenerator();

console.log("call 1 yielded", gen.next().value); // 0
console.log("call 2 yielded", gen.next('pretzel').value); // 1 pretzel
console.log("call 3 yielded", gen.next('california').value); // 2 california
console.log("call 4 yielded", gen.next('mayonnaise').value); // 3 mayonnaise

При первом вызове генератора выполняется console.log(0);, а затем начинается выполнение console.log(1, yield 10).Но когда он доходит до выражения yield, next() возвращает это значение, за до фактического вызова console.log().

При следующем вызове генератора он возобновляет с того места, где он оставилoff, который создает аргументы для console.log().Выражение yield 10 заменяется аргументом next(), поэтому оно выполняет console.log(1, 'pretzel').

Затем оно начинает выполнять console.log(2, yield 20), и происходит то же самое - перед вызовом 20console.log().

Что MDN пытался показать, так это то, что аргумент next() имеет смысл только начиная со второго вызова, потому что он заменяет значение yield в прерванном выражении, когда генератор возобновляет работу.,Использование аргумента в первом вызове не имеет никакого эффекта, потому что нет прерванного выражения для замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...