Перейти к содержимому

Функции-генераторы JavaScript

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

Понимание функций-генераторов

Основы функций-генераторов

Функция-генератор объявляется аналогично обычной функции, но использует синтаксис function*. Звёздочка (*) указывает на то, что функция является генератором. Вот простой пример функции-генератора:


javascript
function* simpleGenerator() {
}

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


Output appears here after Run.

Вы также можете потреблять генератор напрямую с помощью цикла for...of, который автоматически обрабатывает итерацию и останавливается, когда done имеет значение true:

javascript
for (const value of simpleGenerator()) {
  console.log(value);
}

Управление потоком выполнения

Генераторы особенно ценны для управления потоком выполнения. Вы можете приостановить выполнение функции на каждом yield и возобновить его извне. Они запоминают своё состояние, то есть переменные и их значения, между повторными входами. Вы также можете досрочно завершить генератор с помощью return() или внедрить ошибки с помощью throw() для обработки исключений внутри генератора.

Продвинутые паттерны генераторов

Использование yield*

В сложных сценариях может потребоваться делегировать часть управления генератором другому генератору. Здесь на сцену выходит yield*. Он позволяет генератору передавать значения из другого генератора, итерируемого объекта или массива.


Output appears here after Run.

Передача значений в генераторы

Генераторы не только могут выдавать значения, но и принимать их через метод next(). Это делает их интерактивными и позволяет внешнему влиять на их поведение.


Output appears here after Run.

Практическое применение генераторов JavaScript

Управление асинхронными операциями

Генераторы могут упростить обработку асинхронных операций, избегая сценария «ад обратных вызовов». В сочетании с промисами они позволяют писать асинхронный код, который легко как писать, так и читать.


Output appears here after Run.

Примечание: Это упрощённый ручной обработчик. В продакшене обычно используют async/await или библиотеки вроде co для автоматизации итерации.

Реализация бесконечных циклов

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


Output appears here after Run.

Заключение

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

Практика

Какова роль символа '*' перед ключевым словом функции в генераторах JavaScript?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.