Генератори на Node.js & Сравнете с обратно извикване

Съдържание:

Anonim

В този урок ще научим за генераторите и техните разлики с обратните обаждания

Какво представляват генераторите?

Генераторите станаха доста известни в Node.js напоследък и това вероятно поради това, което са способни да правят.

  • Генераторите са изпълнения на функции, които могат да бъдат преустановени и възобновени по-късно.
  • Генераторите са полезни, когато изпълняват понятия като „мързеливо изпълнение“. Това всъщност означава, че чрез спиране на изпълнението и възобновяване по желание, ние сме в състояние да изтегляме стойности само когато имаме нужда.

Генераторите имат следните 2 основни метода

  1. Метод на добив - Методът на добив се извиква във функция, за да спре изпълнението на функцията на конкретния ред, където се извиква методът на добив.
  2. Следващ метод - Този метод се извиква от основното приложение, за да възобнови изпълнението на функция, която има метод за добив. Изпълнението на функцията ще продължи до следващия метод за добив или до края на метода.

Нека разгледаме пример за това как могат да се използват генератори.

В нашия пример ще имаме проста функция Добавяне, която ще добави 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 към нашата функция Добавяне. Тази стойност ще бъде заместена в параметъра x на нашата функция за добавяне.
  4. След като извикаме функцията next (), функцията Add () ще възобнови изпълнението. Когато следващият оператор var y = yield (null) ще бъде изпълнен, функцията Add () отново ще спре да се изпълнява.
  5. След повторно извикване на функцията next () ще се изпълнят следващите изрази и комбинираната стойност на x = 5 и y = 6 ще бъде добавена и върната.

Обратни обаждания срещу генератори

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

Тук са полезни генераторите. Един от най-често срещаните примери за това е при създаване на функции на таймера.

Нека да видим долния пример за това как генераторите могат да се окажат полезни при обратно извикване.

Нашият пример просто ще създаде проста функция за забавяне на времето. След това бихме искали да извикаме тази функция, включваща закъснение от 1000, 2000 и 3000 ms.

Стъпка 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' в асинхронната функция.