Генераторы — новая разновидность функций в ES6. Генераторы могут приостанавливать своё выполнение, возвращая промежуточный результат и далее возобновлять его позже, в произвольный момент времени. По сути, генератор - это пошагово выполняемая функция, для которой программист может контролировать начало следующего шага выполнения.
Основные области применения генераторов:
Итераторы
Асинхронные функции
Процессы
Finite State Machine
Ленивые последовательности
Для объявления генератора используется конструкция function* (функция со звёздочкой):
Внутри функции генератора могут находится yield-выражения - это специальные места в коде, где функция приостанавливает свое выполнение и возвращает результат во внешний мир и ожидает до тех пор, пока не позволят продолжить исполнение дальше, до следующего yield, или до конца функции с вызовом return.
Особенности генераторов:
Генератор может быть бесконечным.
Вызов генератора допускается везде, где можно использовать итераторы.
Нельзя перемотать назад генератор.
yield может быть использован только внутри генераторов и ни в каких других функциях.
Generator functions are actually constructors of iterators.
Если последним выражением генератора является return value, то во многих случаях value игнорируется. Лучше возвращать последнее значение через yield.