Сначала мы объясним, что такое генераторы и зачем они нам нужны. Генераторы JavaScript впервые были представлены в ES6. Это обычные функции с немного странным поведением. Они могут остановить свое выполнение в середине функции и возобновить ее дальше с той же точки.

Чем они отличаются от обычных функций?

В обычной функции JavaScript мы ожидаем, что код внутри будет выполняться до тех пор, пока мы не достигнем оператора возврата, ошибки или конца функции.

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

Синтаксис

Они объявляются как обычная функция, плюс к ней добавляется один *. Вот самый простой пример. Функция, которая возвращает числа от 1 до 5:

Самое важное в генераторах — это ключевое слово yield. Он называется yield expression, потому что при перезапуске генератора мы отправим значение обратно, и все, что мы отправим, будет вычисленным результатом этого выражения. Чтобы перебрать генератор, мы должны использовать над ним метод .next(). На самом деле он возвращает ответ типа object с двумя свойствами: value и done. Свойство value — это yielded-out значение, а done — логическое значение, указывающее, завершился ли генератор. или нет.

Вот иллюстрация того же:

Каковы преимущества?

Эффективная память

Генераторы эффективно используют память, что означает, что генерируются только те значения, которые необходимы. В обычных функциях значения должны быть созданы заранее и сохранены для последующего использования. Используются только те данные и расчеты, которые необходимы.

Ленивая оценка

Оценка выражения не вычисляется до тех пор, пока не понадобится его значение. Если он не нужен, его не будет. Он рассчитывается по запросу.

Случаи использования

Вы можете спросить себя, зачем мне это нужно? Ну, это множество хороших практических примеров того, где и как мы можем использовать генераторы.

Генератор уникальных идентификаторов

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

Использование с обещаниями

Вот пример с промисами. Вся структура может показаться сложной, но если мы сосредоточимся на *main, мы увидим, что мы вызываем API и получаем результат в виде данных, как если бы это был синхронный вызов. В нем нет добавления yield.

Заключение

Если мы хотим писать отличный код, его должны легко поддерживать другие разработчики, и генераторы дают нам именно это: чистую и понятную структуру, которой легко следовать.