Генератори Node.js & Порівняйте із зворотними викликами

Зміст:

Anonim

У цьому підручнику ми збираємось дізнатись про генератори та їхні відмінності від зворотних викликів

Що таке генератори?

Нещодавно генератори стали досить відомими в Node.js, і це, мабуть, завдяки тому, що вони здатні робити.

  • Генератори - це виконання функцій, яке можна призупинити та відновити пізніше.
  • Генератори корисні при виконанні таких понять, як "ледаче виконання". Це в основному означає, що, призупинивши виконання та відновивши за бажанням, ми можемо отримувати значення лише тоді, коли нам це потрібно.

Генератори мають 2 основні методи

  1. Метод Yield - метод yield викликається у функції, щоб зупинити виконання функції у певному рядку, де викликається метод yield.
  2. Наступний метод - Цей метод викликається з основної програми для відновлення виконання функції, яка має метод 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 - це специфіка генераторів. Це робить його потужною конструкцією для призупинення функції посеред чого-небудь. Отже, тут виконання функції буде зупинено, доки ми не викликаємо наступну () функцію, що буде зроблено на кроці 4. У цей момент значення x стане 6, а виконання функції буде зупинено.
  3. Тут ми спочатку викликаємо функцію генератора і надсилаємо значення 5 до нашої функції Add. Це значення буде замінено на параметр 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 як 2000.
  4. Нарешті, ми викликаємо функцію Yield разом із функцією Timedelay з 3000 як значення параметра.

Резюме

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