Генераторы — это функции, из которых можно выйти, а затем снова войти. Их контекст (привязки переменных) будет сохранен при повторных входах.
Давайте поговорим о функции, которая печатает буквы алфавита.
Эта функция будет выполнять весь console.log() сверху вниз, и мы не можем остановить ее или взаимодействовать с ней в этот период времени.
Если функция:
1. Выдать ошибку.
2. Что-то вернуть.
Итак, как мы, например, взаимодействуем с этими внутренними значениями функции во время выполнения? Можем ли мы остановиться и продолжить выполнение там, где мы хотим?
Мы можем сделать это с,
Генераторы
При представлении генераторов мы должны говорить о трех концепциях.
- Функция* ()
- Объект генератора
- Доходность
Функция*()
Объявление function*
(ключевое слово function
, за которым следует звездочка) определяет функцию-генератор, которая возвращает объект Generator
.
Функции этого типа отличаются от обычных функций только звездочкой (*), которая говорит нам, что это функция генератора.
Итак, давайте создадим нашу функцию-генератор,
Вызов функции-генератора не приводит к немедленному выполнению ее тела; вместо этого возвращается объект-генератор для функции.
Объект генератора
Объект Generator
возвращается функцией генератора и соответствует как итерируемому протоколу, так и протоколу итератора.
Итак, давайте назовем наш объект-генератор
Но почему возвращается Object [Generator] {}, а не значение?
Поскольку мы не вызываем функцию*, для этого нам нужно добавить .next() в наш генератор.
Но как теперь нам взаимодействовать с этими console.log внутри функции?
С третьей концепцией нашего генератора yield.
Доходность
Ключевое слово yield
используется для приостановки и возобновления функции генератора (function*
или устаревшая функция генератора).
Yield можно вызывать только непосредственно из функции-генератора, которая его содержит. Его нельзя вызвать из вложенных функций или обратных вызовов.
Давайте добавим доходность к нашему примеру,
Мы видим, что сначала выполняется console.log(), а затем функция останавливается в yield. Возврат выполнения вне функции. Например, запуск другого console.log() со строкой «после».
Мы также можем вернуть значение с выходом. Но нам нужно вызывать value, когда мы вызываем функцию .next() таким образом.
Почему объект?
Поскольку метод .next() возвращает Object
с двумя свойствами:
значение –> Любое значение.
value
— любое значение JavaScript, возвращаемое итератором. Можно опустить, еслиdone
равноtrue
.
готово –> логическое значение.
- Имеет значение
true
, если итератор прошел конец итерируемой последовательности. В этом случаеvalue
необязательно указывает возвращаемое значение итератора. - Имеет значение
false
, если итератор смог создать следующее значение в последовательности. Это эквивалентно полному отсутствию указания свойстваdone
.
Ссылки на другие мои работы вы можете найти на Medium и подписаться на меня здесь.
Я часто делюсь советами по программированию в моем Instagram, вы можете поздороваться со мной в моем Twitterили посмотреть, как я программирую в моем Гитхаб.
Большое спасибо и продолжайте кодировать!!!
Йоэль