Функции-генераторы в JavaScript ES6/ES2015

Функции-генераторы в ES2015 (ES6) с помощью ключевого слова yield позволяют определять функции, которые могут возвращать несколько значений. Вот пример простой функции-генератора:

function* someGenerator(){
yield 'Cats';
yield 'Dogs';
yield 'Birds';
}

Обратите внимание на символ * рядом с ключевым словом function: этот символ указывает, что это функция-генератор.

Теперь давайте создадим экземпляр генератора и извлечем его значения, вызвав next():

const gen = someGenerator();
console.log(gen.next().value); // Cats
console.log(gen.next().value); // Dogs
console.log(gen.next().value); // Birds
console.log(gen.next().value); // Undefined

next() возвращает объект со значением и логическим значением done (оно выдает true, если у генератора не осталось значений):

const gen2 = someGenerator();
console.log(gen2.next().done); // false
console.log(gen2.next().done); // false
console.log(gen2.next().done); // false
console.log(gen2.next().done); // true

Генератор ID

Чтобы создать функцию, которая будет генерировать новый идентификатор при каждом новом вызове next(), можно использовать бесконечный цикл while в функции-генераторе. В этом случае бесконечный цикл не опасен, потому что он будет выполняться только один раз, при вызове next():

function* idGen(){
let i = 0;
while (true) {
yield ++i;
}
}
const myIdGen = idGen();
console.log(myIdGen.next().value); // 1
console.log(myIdGen.next().value); // 2
console.log(myIdGen.next().value); // 3
console.log(myIdGen.next().value); // 4

Tags: ,

Добавить комментарий