Рубрики
Без рубрики

Давайте исследуем генераторы ES6

Tiago Lopes Ferreira Давайте исследуем ES6 GeneratorsGenerators – это реализация повторных документов. Большое дело о генераторах заключается в том, что они являются функциями, которые могут приостановить свое исполнение при сохранении контекста. Такое поведение имеет решающее значение при работе с казнями, которые необходимо приостановить, но его контекст поддерживается

Автор оригинала: FreeCodeCamp Community Member.

Tiago Lopes Ferreira

Генераторы – это Реализация порталов Отказ

Большая сделка о генераторах в том, что Это функции, которые могут приостановить свое исполнение при сохранении контекста .

Это поведение имеет решающее значение при работе с казнями, которые необходимо приостановить, но его контекст поддерживается, чтобы восстановить его в будущем.

Звуково звучит ли разработка Async?

Синтаксис

Синтаксис для генераторов начинается с этого Функция * Декларация (обратите внимание на Asterisk ) И доходность через который генератор может приостановить это выполнение.

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

Бег Следующий будет выполнять наши Генератор код до доходность выражение достигнуто.

На этот момент ценность на доходность выделяется и Генератор казнь приостановлено.

урожай

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

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

урожай*

Урожай * Был построен, чтобы позвонить генератору в течение другого генератора.

Наше B Итератор, производимый бар Генератор, не работает должным образом при звонке Foo Отказ

Это потому, что хотя выполнение Foo производит итератор, мы не повторяем его.

Вот почему ES6 привел оператора Урожай * Отказ

Это отлично работает с потребителями данных.

Внутренне Урожай * переходит на каждый элемент на генераторе и доходность Это.

Генераторы как итераторы

Генераторы простые порталы , что означает, что они следуют за считать и итератор Протоколы:

  • ИТЕРИТЕЛЬНО Протокол говорит, что объект должен вернуть итератор функции, ключ которого является Symbol.itereator Отказ
  • итератор Протокол говорит, что итератор должен быть объектом, указывающим на следующий элемент итерации. Этот объект должен содержать функцию, называемую Следующий Отказ

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

Возвращение

Мы можем добавить Возвращение Заявление на наш генератор, однако Возвращение будет вести себя по-разному в зависимости от того, как данные генераторов итерации.

При выполнении итерации вручную, используя Следующий Мы получаем нашу возвращенную стоимость (то есть сделано ), как последнее ценность нашего объекта итератора и нашего сделано Флаг как правда.

С другой стороны, при использовании определенного потребителя данных, таких как для или Разрушение Возвращенное значение игнорируется.

урожай*

Мы видели это Урожай * позволяет нам вызвать генератор внутри генератора.

Он также позволяет нам хранить значение, возвращаемое выполненным генератором.

Бросать

Мы можем бросить внутри генератора и Следующий распространят наше исключение.

Как только исключение выброшено перерывы потока итератора, и это состояние для сделано: правда бесконечно.

Генераторы как потребителей данных

Помимо генераторов, являющихся производителями данных, через доходность У них также есть возможность потреблять данные, используя Следующий Отказ

Здесь есть некоторые интересные очки.

Создание генератора (1)

На этом этапе мы создаем наш генератор g .

Наше исполнение останавливается в точке A .

Первый следующий (2)

Первое исполнение Следующий Получает наш генератор для выполнения до первого доходность утверждение.

На этом первом исполнении любое значение отправлено через Следующий игнорируется. Это потому, что нет доходность Заявление до первого доходность утверждение ?

Наше исполнение приостанавливается в B В ожидании заполнения ценности на урожай .

Далее следующие (3)

На следующие исполнения Следующий Наш генератор запускает код до следующего доходность Отказ

В нашем случае он регистрирует значение, которое проходит через доходность (то есть получил: foo ) И он снова приостановлен на урожай .

Случаи применения

Реализуйте показывать

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

В следующем примере представляет генератор как итеративное, что итерации по чему имени до Макс достигнуто. Потому что наш генератор возвращает, что мы можем использовать для итерации по ценностям.

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

Асинхронный код

Мы можем использовать генераторы для лучшего работы с Async Code, например Обещания Отказ

Это использование случая хорошее введение в новый Async/await на ES8.

Далее является примером получения файла JSON с Обещания Как мы это знаем. Мы будем использовать Джейк Арчибальд Пример на developers.google.com Отказ

Использование СО библиотека И генератор наш код будет выглядеть больше похоже на синхронный код.

Что касается нового Async/await Наш код будет выглядеть очень похоже на нашу предыдущую версию.

Заключение

Это схема, сделанная Axel Rauschmayer на Исследуя ES6 Покажите нам, как генераторы относятся к итераторам.

Генераторы – это реализация имитал и следит за ИТЕРИТЕЛЬНО и итератор протокол. Поэтому их можно использовать для создания повторных документов.

Самая удивительная вещь о генераторах – их способность приостановить их казнь. Для этого ES6 приносит новое заявление под названием доходность Отказ

Однако вызывая генератор внутри генератора не так проста, как выполнение функции генератора. Для этого ES6 имеет Урожай * Отказ

Благодаря ?

Обязательно проверьте мои другие статьи на ES6

Demystingify ES6 Iterables & Iterators Давайте Demystify JavaScript новый способ взаимодействовать с структурами данных. medium.freecodecamp.com

Оригинал: “https://www.freecodecamp.org/news/lets-explore-es6-generators-5e58ed23b0f1/”