Генераторы — это функции, из которых можно выйти, а затем снова войти. Их контекст (привязки переменных) будет сохранен при повторных входах.

Давайте поговорим о функции, которая печатает буквы алфавита.

Эта функция будет выполнять весь console.log() сверху вниз, и мы не можем остановить ее или взаимодействовать с ней в этот период времени.

Если функция:

1. Выдать ошибку.
2. Что-то вернуть.

Итак, как мы, например, взаимодействуем с этими внутренними значениями функции во время выполнения? Можем ли мы остановиться и продолжить выполнение там, где мы хотим?

Мы можем сделать это с,

Генераторы

При представлении генераторов мы должны говорить о трех концепциях.

  1. Функция* ()
  2. Объект генератора
  3. Доходность

Функция*()

Объявление 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или посмотреть, как я программирую в моем Гитхаб.

Большое спасибо и продолжайте кодировать!!!

Йоэль