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
Was this helpful?