01. Generators

Генераторы — новая разновидность функций в ES6. Генераторы могут приостанавливать своё выполнение, возвращая промежуточный результат и далее возобновлять его позже, в произвольный момент времени. По сути, генератор - это пошагово выполняемая функция, для которой программист может контролировать начало следующего шага выполнения.

Основные области применения генераторов:

  • Итераторы

  • Асинхронные функции

  • Процессы

  • Finite State Machine

  • Ленивые последовательности

Для объявления генератора используется конструкция function* (функция со звёздочкой):

// Generator function
function* genFunc() {
  // (A)
  console.log("First");
  yield;
  console.log("Second");
}

// Generator object
const genObj = genFunc();
genObj.next();
// Output: First
genObj.next();
// output: Second

Внутри функции генератора могут находится yield-выражения - это специальные места в коде, где функция приостанавливает свое выполнение и возвращает результат во внешний мир и ожидает до тех пор, пока не позволят продолжить исполнение дальше, до следующего yield, или до конца функции с вызовом return.

Особенности генераторов:

  • Генератор может быть бесконечным.

  • Вызов генератора допускается везде, где можно использовать итераторы.

  • Нельзя перемотать назад генератор.

  • yield может быть использован только внутри генераторов и ни в каких других функциях.

  • Generator functions are actually constructors of iterators.

  • Если последним выражением генератора является return value, то во многих случаях value игнорируется. Лучше возвращать последнее значение через yield.

Last updated