Generátory Node.js & Porovnajte so spätnými volaniami

Obsah:

Anonim

V tomto výučbe sa dozvieme o generátoroch a ich rozdieloch s spätnými volaniami

Čo sú to generátory?

Generátory sa v poslednej dobe v Node.js stali pomerne známymi, a to pravdepodobne vďaka tomu, čo dokážu.

  • Generátory sú vykonávanie funkcií, ktoré je možné pozastaviť a obnoviť neskôr.
  • Generátory sú užitočné pri uskutočňovaní konceptov ako napríklad „lenivé vykonávanie“. To v podstate znamená, že pozastavením vykonávania a obnovením vôle dokážeme vytiahnuť hodnoty iba vtedy, keď to potrebujeme.

Generátory majú nižšie 2 kľúčové metódy

  1. Výnosová metóda - Výnosová metóda sa volá vo funkcii na zastavenie vykonávania funkcie na konkrétnom riadku, kde sa volá výťažková metóda.
  2. Ďalšia metóda - táto metóda sa volá z hlavnej aplikácie na obnovenie vykonávania funkcie, ktorá má výnosovú metódu. Vykonanie funkcie bude pokračovať až do ďalšej metódy výťažku alebo do konca metódy.

Pozrime sa na príklad toho, ako možno použiť generátory.

V našom príklade budeme mať jednoduchú funkciu Pridať, ktorá pridá dve čísla, ale zastavíme vykonávanie metódy v rôznych bodoch, aby sme ukázali, ako je možné použiť generátory.

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

Vysvetlenie kódu: -

  1. Prvým krokom je definovanie našej „funkcie“ generátora. Toto sa robí pridaním „*“ do kľúčového slova funkcie. Potom definujeme funkciu s názvom Add, ktorá prevezme parameter x.
  2. Kľúčové slovo výnos je špecifické pre generátory. Toto z neho robí výkonnú konštrukciu na pozastavenie funkcie uprostred všetkého. Takže tu sa vykonávanie funkcie zastaví, kým nevyvoláme funkciu next (), ktorá sa vykoná v kroku 4. V tomto okamihu bude hodnota x 6 a vykonávanie funkcie sa zastaví.
  3. Toto je miesto, kde najskôr zavoláme funkciu generátora a pošleme hodnotu 5 do našej funkcie Pridať. Táto hodnota bude nahradená v parametri x našej funkcie Pridať.
  4. Keď zavoláme funkciu next (), funkcia Add () obnoví vykonávanie. Po vykonaní ďalšieho príkazu var y = yield (null) sa funkcia Add () opäť zastaví.
  5. Teraz po opätovnom volaní funkcie next () sa spustia ďalšie príkazy a kombinovaná hodnota x = 5 a y = 6 sa pridá a vráti.

Spätné volania vs. generátory

Generátory slúžia na riešenie problému známeho ako spätné volanie peklo. Niekedy sa funkcie spätného volania počas vývoja aplikácie Node.js vnoria natoľko, že je príliš komplikované ich používať.

Tu sú užitočné generátory. Jedným z najbežnejších príkladov je vytváranie funkcií časovača.

Pozrime sa na nasledujúci príklad toho, ako sa generátory môžu ukázať ako užitočné pri spätných volaniach.

Náš príklad iba vytvorí jednoduchú funkciu časového oneskorenia. Potom by sme chceli túto funkciu nazvať s oneskorením 1 000, 2 000 a 3 000 ms.

Krok 1) Definujte našu funkciu spätného volania s potrebným kódom časového oneskorenia.

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

Vysvetlenie kódu: -

  1. Tu vytvárame funkciu s názvom Timedelay s parametrom s názvom ptime. Toto si vyžiada potrebné časové oneskorenie, ktoré chceme v našej žiadosti zaviesť.
  2. Ďalším krokom je iba vytvorenie správy, ktorá sa zobrazí používateľovi s oznámením, že aplikácia bude na tieto početné počty milisekúnd pozastavená.

Krok 2) Teraz sa pozrime na kód, ak by sme začlenili spätné volania. Predpokladajme, že sme chceli začleniť spätné volania založené na hodnote 1 000, 2 000 a 3 000 milisekúnd, nasledujúci kód ukazuje, ako by sme ich potrebovali implementovať pomocou spätných volaní.

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

Vysvetlenie kódu: -

  1. Voláme Timedelay ako spätné volanie s hodnotou 1000.
  2. Ďalej chceme volať funkciu Timedelay znova s ​​hodnotou 2000.
  3. Nakoniec chceme volať funkciu Timedelay znova s ​​hodnotou 3000.

Z vyššie uvedeného kódu môžete vidieť, že sa stáva chaotickejším, pretože chceme začať funkciu volať viackrát.

Krok 3) Teraz sa pozrime, ako implementovať ten istý kód pomocou generátorov. Z nižšie uvedeného kódu teraz vidíte, aké ľahké sa stalo implementovať funkciu Timedelay pomocou generátorov.

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

Vysvetlenie kódu: -

  1. Najprv definujeme funkciu generátora, ktorá sa použije na volanie našej funkcie Timedelay.
  2. Voláme funkciu Yield spolu s funkciou Timedelay s 1000 ako hodnotou parametra.
  3. Potom voláme funkciu Yield spolu s funkciou Timedelay s hodnotou parametra 2000.
  4. Na záver voláme funkciu Výnos spolu s funkciou Timedelay s 3000 ako hodnotou parametra.

Zhrnutie

Generátory možno tiež použiť na zmiernenie problémov s vnorenými spätnými volaniami a na pomoc pri odstraňovaní takzvaného pekla spätného volania. Generátory sa používajú na zastavenie spracovania funkcie. To sa dosiahne použitím metódy „výnos“ v asynchrónnej funkcii.