Почему мой генератор не выдает значение аргумента, переданное из следующего метода? - PullRequest
1 голос
/ 11 февраля 2020

Я читаю документацию по функциям генератора на MDN , чтобы изучать Redx-сагу. Здесь они упоминают, что вы можете передать аргументы методу iterator.next (), как показано ниже в этом примере на сайте.

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

var gen = logGenerator();

// the first call of next executes from the start of the function
// until the first yield statement
gen.next();             // 0
gen.next('pretzel');    // 1 pretzel
gen.next('california'); // 2 california
gen.next('mayonnaise'); // 3 mayonnaise

Работает как положено.


Теперь я пытаюсь поиграть с этим и написал этот генератор.

function* foo() {
    yield '1';
    console.log(yield);
    yield '3';
    return '4';
}

var result = foo();
console.log(result.next());
console.log(result.next(2));
console.log(result.next());
console.log(result.next());

Ожидаемый вывод: 1 2 3 4 , но я получаю 1, не определено, не определено, 3,4, В чем проблема ?

РЕДАКТИРОВАТЬ : Как указано в комментариях, я не полностью отобразил вывод правильно. Пожалуйста, запустите фрагмент. Если я добавлю аргументы ко всем операторам next (), я получу следующий вывод.

{ value: '1', done: false }
{ value: undefined, done: false }
3
{ value: '3', done: false }
{ value: '4', done: true }

1 Ответ

0 голосов
/ 11 февраля 2020

Функции генератора используют yield для получения при каждом GeneratorObject.next(). yield произойдет даже в console.log(), так что это может привести к синтаксической ошибке. Когда вы используете GeneratorObject.next() в первый раз, он выдает, и генератор прекращает выполнение, поэтому ничего, кроме yield, не запускается. Когда вы снова вызываете GeneratorObject.next(argument), все равно, что аргумент передается предыдущему yield, для использования только перед yield. Смотрите следующее:

function* gen_create(){ 
  let a = yield 1;
  console.log(a);
  let b = yield 2;
  console.log(b);
  let c = yield 3;
  console.log(c);
  return 4;
}
const gen = gen_create();
console.log(gen.next('cool').value);
// notice that 'cool' was not consoled
console.log(gen.next().value); // nothing was passed so it's undefined
console.log(gen.next('wow').value);
console.log(gen.next('last return works like yield').value);
...