08. Generators as Iterators

Вызов генератора можно использовать везде, где можно использовать итератор:

Генераторы можно использовать в цикле for..of

let generator = generateSequence();
for (let value of generator) {
  console.log(value); // 1, затем 2, затем 3
}

При помощи оператора spread можно разложить генератор в последовательность:

let generator = generateSequence();
let resArray = [...generator];

На генераторе можно использовать деструктуризацию:

const [x, y] = generateSequence();

Если исполнение генератора добирается до return result, то генератор возвращает значение { value: result, done: true }.

Большинство конструкций с итераторами игнорируют это значение, если done: true

function* genFuncWithReturn() {
  yield "a";
  yield "b";
  return "The result";
}

for (const x of genFuncWithReturn()) {
  console.log(x);
}
// Output:
// a
// b

const arr = [...genFuncWithReturn()]; // ['a', 'b']

yield*, an operator for making recursive generator calls, does consider values inside done objects. The result of yield* is the end-of-iteration value:

function* logReturned(genObj) {
  const result = yield* genObj;
  console.log("res = ", result); // (A)
}

[...logReturned(genFuncWithReturn())];
// res = The result
// [ 'a', 'b' ]

Last updated