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

Урожай! Урожай! Как генераторы работают в JavaScript.

Ashay Mandwarya ??? Урожай! Урожай! Как работают генераторы в JavaScript.photo by frederik trovatten.com на unsplashif Название уже не дает подсказка, мы будем обсуждать генераторы в этой части. Прежде чем перейти на генераторы, давайте пересмотрим некоторые основы о функциях. В JavaScript функции являются набор

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

Ashay Mandwarya ???

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

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

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

Нам нужно только иметь в виду эти 3 очка, чтобы понять генераторы.

Генераторы

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

Для ясности рассмотрите возможность играть в игру и вдруг мама призывает к какой-то работе. Вы приостановите игру, помогите ей, затем возобновить игру снова. Это то же самое с генераторами.

Итераторы сами по себе являются огромной темой и не являются целью этой статьи.

Основной синтаксис

Генераторы определяются как функция с помощью звездочки (*) рядом с функцией.

function* name(arguments) {   statements}

Имя – Имя функции.

Аргументы – Аргументы для функции.

заявления – Тело функции.

Возвращение

Функция может вернуть практически все, что начиная от значения, объекта или другой функции. Функция генератора возвращает специальный объект, называемый объект генератора ( не совсем правда ). Объект выглядит как фрагмент ниже

{   value: value,  done: true|false}

Объект имеет два свойства ценность и сделано Отказ Значение содержит значение, чтобы быть уступил. Сделано состоит из Логический (правда | false) который говорит генератору, если .Next () даст ценность или неопределенный.

Вышеуказанное утверждение будет трудно переваривать. Давайте изменим это с примером.

function* generator(e) {  yield e + 10;  yield e + 25;  yield e + 33;}var generate = generator(27);
console.log(generate.next().value); // 37console.log(generate.next().value); // 52console.log(generate.next().value); // 60console.log(generate.next().value); // undefined

Давайте понять механику вышеуказанной линейки кода по линии.

Линии 1-5: Линии 1-5 определяют генератор, имеющий то же имя с аргументом E. Внутри тела функции он содержит кучу утверждений с доходом ключевых слов, а некоторая операция выполняется после этого.

Линия 6: Линия 6 присваивает генератор к переменной вызываемой генерации.

Линии 8-11: Эти линии называют кучу console.log Каждый звонит генератором прикован к Следующий Метод, который требует ценность Свойство объекта генератора.

Всякий раз, когда вызывается генераторная функция, в отличие от нормальных функций, она не начинает выполнение сразу. Вместо этого возвращается итератор ( Фактическая причина * используется генератором. Он говорит JS, что объект итератора должен быть возвращен ). Когда Далее () Способ итератора вызывается, выполнение генератора запускается и выполняет, пока он не найдет первый доходность утверждение. На данной точке доходности возвращается объект генератора, спецификации которых уже объяснены. Призывая Далее () Функция снова возобновит функцию генератора, пока не найдет другой доходность Заявление и цикл возвращаются до всех Урожайность исчерпаны.

После этого момента Следующий называется, он возвращает объект генератора со значением undefined.

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

А Возвращение Заявление в генераторе заставит генератор завершить его выполнение, как вся другая функция. Сделано недвижимость объекта генератора будет установлен на правда и ценность Вернувшиеся будут установлены на ценность Свойство объекта генератора. Все остальные Урожайность вернется undefined Отказ

Если ошибка бросается, то также выполнение генератора остановится, давая сам генератор.

Для Урожайность Генератор, который нам нужно указать * против доходность чтобы сказать JS, что генератор получен. Урожай * Делегаты другую функцию генератора – это причина, по которой мы можем доходность Все значения Генератор2 Функция с использованием generate.next () оригинального генератора функции. Первое значение уступил от первого генератора и последних двух уступил Значения генерируются функцией генератора, но уступил исходным генератором.

Преимущества

Ленивая загрузка

Ленивая погрузка – это по сути, оценивается только тогда, когда в нем есть необходимость. Как мы увидим в предстоящем примере, мы действительно можем сделать это с генераторами. Мы могли бы дать только ценности, когда это необходимо, а не все одновременно.

Ниже пример находится из другого примера в этой статье, и он генерирует бесконечные случайные числа. Здесь мы можем видеть, что мы можем позвонить столько Далее () Как мы хотим, и не получить все значения, которые он производит. Только необходимые.

function * randomize() {  while (true) {let random = Math.floor(Math.random()*1000);    yield random;  }}
var random= randomize();
console.log(random.next().value)

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

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

Ловушки

Генераторы чрезвычайно полезны, но также имеют свои собственные подводные камни.

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

Почему нам нужны генераторы?

Генераторы обеспечивают широкий спектр использования в JavaScript. Давайте постараемся воссоздать некоторые сами.

Реализующие итераторы

Мы распечатаем все слова, присутствующие в строке с использованием итераторов. Строки тоже итераторы.

Итераторы

const string = 'abcde';const iterator = string[Symbol.iterator]();console.log(iterator.next().value)console.log(iterator.next().value)console.log(iterator.next().value)console.log(iterator.next().value)console.log(iterator.next().value)

Вот одно и то же, используя генераторы

function * iterator() {yield 'a';yield 'b';yield 'c';yield 'd';yield 'e';}for (let x of iterator()) {console.log(x);}

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

  • Нет реализации следующий()
  • Нет [Symbal.iterator] () вызов
  • В некоторых случаях нам даже нужно установить объект.done Значение возврата свойства до True/false с использованием итераторов.

Async-await ~ Обещания + генераторы

Вы можете прочитать мой предыдущий Статья о Async/ждут, если вы хотите узнать о них и проверить это для обещаний.

Железно, async/a ждать – это просто реализация генераторов, используемых с обещаниями.

Async-await.

async function async-await(){let a=await(task1);console.log(a);
let b=await(task2);console.log(b);
let c=await(task3);console.log(c);
}

Обещания + генераторы

function * generator-promise(){let a=yield Promise1();console.log(a);let b=yield Promise1();console.log(b);let c=yield Promise1();console.log(c);
}

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

Бесконечная структура данных

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

function * randomize() {  while (true) {let random = Math.floor(Math.random()*1000);    yield random;  }}var random= randomize();while(true)console.log(random.next().value)

В приведенном выше фрагменте мы создаем бесконечный генератор, который даст случайное число на каждом Далее () вызов. Его можно назвать бесконечным потоком случайных чисел. Это очень простой пример.

Вывод

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

Следуй за мной и аплодируйте!