Вы можете видеть, что происходит лучше, регистрируя, что генератор выдает каждый раз, а также добавляя значения в выражения 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)
, и происходит то же самое - перед вызовом 20
console.log()
.
Что MDN пытался показать, так это то, что аргумент next()
имеет смысл только начиная со второго вызова, потому что он заменяет значение yield
в прерванном выражении, когда генератор возобновляет работу.,Использование аргумента в первом вызове не имеет никакого эффекта, потому что нет прерванного выражения для замены.