Генераторы и генераторы Node.js Сравните с обратными вызовами

Содержание:

Anonim

В этом руководстве мы узнаем о генераторах и их отличиях от обратных вызовов.

Что такое генераторы?

В последнее время генераторы стали довольно известными в Node.js, и это, вероятно, из-за того, на что они способны.

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

Генераторы имеют следующие 2 основных метода

  1. Метод yield - метод yield вызывается в функции, чтобы остановить выполнение функции в конкретной строке, где вызывается метод yield.
  2. Следующий метод - этот метод вызывается из основного приложения для возобновления выполнения функции, которая имеет метод yield. Выполнение функции будет продолжаться до следующего метода yield или до конца метода.

Давайте посмотрим на пример того, как можно использовать генераторы.

В нашем примере у нас будет простая функция Add, которая добавит 2 числа, но мы продолжим останавливать выполнение метода в разных точках, чтобы продемонстрировать, как можно использовать генераторы.

function* Add(x) {yield x + 1;var y = yield(null);y = 6return x + y;}var gen = Add(5);gen.next();gen.next();

Пояснение к коду: -

  1. Первым шагом является определение «функции» нашего генератора. Обратите внимание, что это делается путем добавления «*» к ключевому слову функции. Затем мы определяем функцию с именем Add, которая принимает параметр x.
  2. Ключевое слово yield специфично для генераторов. Это делает его мощной конструкцией для приостановки функции в середине чего-либо. Итак, здесь выполнение функции будет остановлено до тех пор, пока мы не вызовем функцию next (), что будет выполнено на шаге 4. В этот момент значение x станет равным 6, и выполнение функции будет остановлено.
  3. Здесь мы сначала вызываем функцию генератора и отправляем значение 5 в нашу функцию добавления. Это значение будет подставлено в параметр x нашей функции Add.
  4. Как только мы вызовем функцию next (), функция Add () возобновит выполнение. Когда будет выполнен следующий оператор var y = yield (null), функция Add () снова прекратит выполнение.
  5. Теперь после повторного вызова функции next () будут выполняться следующие операторы, и объединенное значение x = 5 и y = 6 будет добавлено и возвращено.

Обратные вызовы против генераторов

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

Вот где пригодятся генераторы. Один из наиболее распространенных примеров этого - создание функций таймера.

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

В нашем примере мы просто создадим простую функцию задержки времени. Затем мы хотели бы вызвать эту функцию с задержкой в ​​1000, 2000 и 3000 мс.

Шаг 1) Определите нашу функцию обратного вызова с необходимым кодом временной задержки.

function Timedelay(ptime, callback) {setTimeout(function() {callback("Pausing for " + ptime);}, time);}

Пояснение к коду: -

  1. Здесь мы создаем функцию под названием Timedelay с параметром ptime. Это займет необходимую временную задержку, которую мы хотим ввести в нашем приложении.
  2. Следующим шагом является создание сообщения, которое будет отображаться пользователю, в котором говорится, что приложение будет приостановлено на это количество миллисекунд.

Шаг 2) Теперь давайте посмотрим на код, если бы мы использовали обратные вызовы. Предположим, мы хотим включить обратные вызовы на основе значений 1000, 2000 и 3000 миллисекунд, приведенный ниже код показывает, как нам нужно реализовать их с помощью обратных вызовов.

Timedelay(1000, function(message) {console.log(msg);Timedelay(2000, function(message) {console.log(msg);Timedelay(3000, function(message) {console.log(msg);})})})

Пояснение к коду: -

  1. Мы вызываем Timedelay как обратный вызов со значением 1000.
  2. Затем мы хотим снова вызвать функцию Timedelay со значением 2000.
  3. Наконец, мы хотим снова вызвать функцию Timedelay со значением 3000.

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

Шаг 3) Теперь давайте посмотрим, как реализовать тот же код с помощью генераторов. Из приведенного ниже кода вы можете увидеть, насколько просто стало реализовать функцию Timedelay с помощью генераторов.

function* Messages() {console,log(yield(Timedelay(1000, function(){})));console,log(yield(Timedelay(2000, function(){})));console,log(yield(Timedelay(3000, function(){})));}

Пояснение к коду: -

  1. Сначала мы определяем функцию генератора, которая будет использоваться для вызова нашей функции Timedelay.
  2. Мы вызываем функцию Yield вместе с функцией Timedelay со значением 1000 в качестве значения параметра.
  3. Затем мы вызываем функцию Yield вместе с функцией Timedelay с 2000 в качестве значения параметра.
  4. Наконец, мы вызываем функцию Yield вместе с функцией Timedelay со значением 3000 в качестве значения параметра.

Резюме

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