Node.js Generators & Порівняти зі зворотними викликами
У цьому підручнику ми збираємося дізнатися про Generators та їх відмінності від зворотних викликів
Що таке генератори?
Generators стали досить відомими в Node.js останнім часом, і це, мабуть, через те, на що вони здатні.
- Generators — це виконання функцій, які можна призупинити та відновити пізніше.
- Generators корисні при виконанні таких концепцій, як «ліниве виконання». По суті, це означає, що, призупиняючи виконання та відновлюючи за бажанням, ми можемо отримувати значення лише тоді, коли нам це потрібно.
Generators мають наведені нижче 2 основні методи.
- Метод урожайності – Метод yield викликається у функції, щоб зупинити виконання функції в певному рядку, де викликається метод yield.
- Наступний спосіб – Цей метод викликається з основної програми, щоб відновити виконання функції, яка має метод yield. Виконання функції триватиме до наступного методу yield або до завершення методу.
Розглянемо на прикладі, як можна використовувати генератори.
У нашому прикладі ми матимемо просту функцію Add, яка додасть 2 числа, але ми будемо продовжувати зупиняти виконання методу в різних точках, щоб продемонструвати, як можна використовувати генератори.
function* Add(x) { yield x + 1; var y = yield(null); y = 6 return x + y; } var gen = Add(5); gen.next(); gen.next();
Пояснення коду
- Першим кроком є визначення нашої «функції» генератора. Зверніть увагу, що це робиться шляхом додавання «*» до ключового слова функції. Потім ми визначаємо функцію Add, яка приймає параметр x.
- Ключове слово yield є специфічним для генераторів. Це робить його потужною конструкцією для призупинення функції посеред будь-чого. Отже, тут виконання функції буде зупинено, доки ми не викличемо функцію next(), що буде зроблено на кроці 4. У цей момент значення x стане 6 і виконання функції буде припинено.
- Тут ми спочатку викликаємо функцію генератора та надсилаємо значення 5 нашій функції Add. Це значення буде замінено в параметр x нашої функції Add.
- Після виклику функції next() функція Add() відновить виконання. Коли наступний оператор var y= yield(null) буде виконано, функція Add() знову припинить виконання.
- Тепер після повторного виклику функції next() будуть виконані наступні оператори, а комбіноване значення x=5 і y=6 буде додано та повернено.
Зворотні виклики проти генераторів
Generators використовуються для вирішення проблеми, відомої як пекло зворотного виклику. Іноді функції зворотного виклику стають настільки вкладеними під час розробки програми Node.js, що використання функцій зворотного виклику стає надто складним.
Ось де генератори корисні. Одним із найпоширеніших прикладів цього є створення функцій таймера.
Давайте подивимося на наведений нижче приклад того, як генератори можуть бути корисними для зворотних викликів.
Наш приклад просто створить просту функцію затримки часу. Тоді ми хотіли б викликати цю функцію, що включає затримку 1000, 2000 і 3000 мс.
Крок 1) Визначте нашу функцію зворотного виклику з необхідним кодом затримки.
function Timedelay(ptime, callback) { setTimeout(function() { callback("Pausing for " + ptime); }, time); }
Пояснення коду
- Тут ми створюємо функцію під назвою Timedelay з параметром під назвою ptime. Це займе необхідну затримку, яку ми хочемо ввести в нашу програму.
- Наступним кроком є створення повідомлення, яке відображатиметься користувачеві про те, що програма призупиняється на цю кількість мілісекунд.
Крок 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); }) }) })
Пояснення коду
- Ми називаємо Timedelay зворотним викликом зі значенням 1000.
- Далі ми знову хочемо викликати функцію Timedelay із значенням 2000.
- Нарешті, ми хочемо знову викликати функцію Timedelay зі значенням 3000.
З наведеного вище коду ви можете побачити, що він стає ще безладнішим, оскільки ми хочемо почати викликати функцію кілька разів.
Крок 3) Тепер давайте подивимося, як реалізувати той самий код за допомогою генераторів. З наведеного нижче коду ви можете побачити, наскільки просто стало реалізувати функцію Timedelay за допомогою генераторів.
function* Messages() { console,log(yield(Timedelay(1000, function(){}))); console,log(yield(Timedelay(2000, function(){}))); console,log(yield(Timedelay(3000, function(){}))); }
Пояснення коду
- Спочатку ми визначаємо функцію генератора, яка буде використовуватися для виклику нашої функції Timedelay.
- Ми викликаємо функцію Yield разом із функцією Timedelay із значенням параметра 1000.
- Потім ми викликаємо функцію Yield разом із функцією Timedelay із значенням параметра 2000.
- Нарешті, ми викликаємо функцію Yield разом із функцією Timedelay із значенням параметра 3000.
Підсумки
Generators також можна використовувати, щоб полегшити проблеми з вкладеними зворотними викликами та допомогти у видаленні того, що відомо як пекло зворотних викликів. Generators використовуються для зупинки обробки функції. Це досягається за допомогою методу 'yield' в асинхронній функції.