Node.js Generators & Porovnejte se zpětnými voláními

V tomto tutoriálu se něco naučíme Generators a jejich rozdíly se zpětnými voláními

Co jsou generátory?

Generators se stali docela slavnými v Node.js v poslední době a to je pravděpodobně kvůli tomu, co jsou schopni dělat.

  • Generators jsou provádění funkcí, které lze pozastavit a obnovit později.
  • Generators jsou užitečné při provádění konceptů, jako je „líné provádění“. To v podstatě znamená, že pozastavením provádění a jeho obnovením podle libosti jsme schopni vytáhnout hodnoty pouze tehdy, když to potřebujeme.

Generators mají níže uvedené 2 klíčové metody.

  1. Výtěžková metoda – Metoda výnosu je volána ve funkci k zastavení provádění funkce na konkrétním řádku, kde je volána metoda výnosu.
  2. Další metoda – Tato metoda je volána z hlavní aplikace pro obnovení provádění funkce, která má metodu výnosu. Provádění funkce bude pokračovat až do další metody výnosu nebo do konce metody.

Podívejme se na příklad, jak lze generátory použít.

V našem příkladu budeme mít jednoduchou funkci Add, která přidá 2 čísla, ale provádění metody budeme nadále zastavovat na různých místech, abychom ukázali, jak lze generátory použít.

Node.js Generators

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

var gen = Add(5);

gen.next();

gen.next(); 

Vysvětlení kódu

  1. Prvním krokem je definování naší „funkce“ generátoru. Všimněte si, že se to provede přidáním „*“ ke klíčovému slovu funkce. Potom definujeme funkci nazvanou Add, která přebírá parametr x.
  2. Klíčové slovo výnos je specifické pro generátory. Díky tomu je to výkonný konstrukt pro pozastavení funkce uprostřed čehokoli. Takže zde bude provádění funkce zastaveno, dokud nevyvoláme funkci next(), což bude provedeno v kroku 4. V tomto okamžiku se hodnota x stane 6 a provádění funkce se zastaví.
  3. Zde nejprve zavoláme funkci generátoru a odešleme hodnotu 5 naší funkci Add. Tato hodnota bude nahrazena v parametru x naší funkce Add.
  4. Jakmile zavoláme funkci next(), funkce Add() obnoví provádění. Když bude proveden další příkaz var y= yield(null), funkce Add() se opět zastaví.
  5. Nyní po opětovném volání funkce next() se spustí další příkazy a kombinovaná hodnota x=5 a y=6 bude přidána a vrácena.

Zpětná volání vs. generátory

Generators se používají k řešení problému, který je známý jako zpětné volání. Někdy se funkce zpětného volání během vývoje aplikace Node.js tak vnoří, že je prostě příliš komplikované používat funkce zpětného volání.

Zde jsou užitečné generátory. Jedním z nejběžnějších příkladů je vytváření funkcí časovače.

Podívejme se na níže uvedený příklad toho, jak se generátory mohou ukázat jako užitečné při zpětných voláních.

Náš příklad pouze vytvoří jednoduchou funkci časového zpoždění. Tuto funkci bychom pak chtěli volat se zpožděním 1000, 2000 a 3000 ms.

Krok 1) Definujte naši funkci zpětného volání s potřebným kódem časového zpoždění.

Zpětná volání vs. Generators

function Timedelay(ptime, callback) {

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

Vysvětlení kódu

  1. Zde vytváříme funkci nazvanou Timedelay s parametrem nazvaným ptime. To zabere nezbytnou časovou prodlevu, kterou chceme zavést v naší aplikaci.
  2. Dalším krokem je pouze vytvoření zprávy, která se uživateli zobrazí, že aplikace bude na tolik milisekund pozastavena.

Krok 2) Nyní se podívejme na kód, pokud bychom začlenili zpětná volání. Předpokládejme, že jsme chtěli začlenit zpětná volání na základě hodnoty 1000 2000, 3000 XNUMX a XNUMX XNUMX milisekund, níže uvedený kód ukazuje, jak bychom je potřebovali implementovat pomocí zpětných volání.

Zpětná volání vs. Generators

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

Vysvětlení kódu

  1. Časové zpoždění nazýváme jako zpětné volání s hodnotou 1000.
  2. Dále chceme znovu zavolat funkci Timedelay s hodnotou 2000.
  3. Nakonec chceme znovu zavolat funkci Timedelay s hodnotou 3000.

Z výše uvedeného kódu můžete vidět, že je to složitější, protože chceme začít volat funkci vícekrát.

Krok 3) Nyní se podívejme, jak implementovat stejný kód pomocí generátorů. Z níže uvedeného kódu nyní můžete vidět, jak snadné se stalo implementovat funkci Timedelay pomocí generátorů.

Zpětná volání vs. Generators

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

Vysvětlení kódu

  1. Nejprve definujeme funkci generátoru, která bude použita k volání naší funkce Timedelay.
  2. Voláme funkci Yield spolu s funkcí Timedelay s 1000 jako hodnotou parametru.
  3. Potom voláme funkci Yield spolu s funkcí Timedelay s hodnotou parametru 2000.
  4. Nakonec voláme funkci Yield spolu s funkcí Timedelay s 3000 jako hodnotou parametru.

Shrnutí

Generators lze také použít ke zmírnění problémů s vnořenými zpětnými voláními a pomoci při odstraňování toho, co je známé jako peklo zpětného volání. Generators se používají k zastavení zpracování funkce. Toho je dosaženo použitím metody 'yield' v asynchronní funkci.