V tomto kurzu se budeme učit o generátorech a jejich rozdílech s zpětnými voláními
Co jsou to generátory?
Generátory se v Node.js v poslední době staly docela slavnými, a to pravděpodobně kvůli tomu, co dokážou.
- Generátory jsou spouštění funkcí, které lze pozastavit a obnovit později.
- Generátory jsou užitečné při provádění konceptů, jako je „líné provedení“. To v podstatě znamená, že pozastavením provádění a pokračováním dle libosti jsme schopni vytáhnout hodnoty, pouze když to potřebujeme.
Generátory mají níže uvedené 2 klíčové metody
- Metoda výtěžku - Metoda výtěžku je volána ve funkci, která zastaví provádění funkce na konkrétním řádku, kde je volána metoda výtěžku.
- Další metoda - Tato metoda se volá z hlavní aplikace, aby se obnovilo provádění funkce, která má metodu výtěžku. Provádění funkce bude pokračovat až do další metody výtěžku nebo do konce metody.
Podívejme se na příklad, jak lze použít generátory.
V našem příkladu budeme mít jednoduchou funkci Přidat, která přidá 2 čísla, ale budeme pokračovat v zastavení provádění metody v různých bodech, abychom předvedli, jak lze použít generátory.
function* Add(x) {yield x + 1;var y = yield(null);y = 6return x + y;}var gen = Add(5);gen.next();gen.next();
Vysvětlení kódu: -
- Prvním krokem je definování naší „funkce“ generátoru. Všimněte si, že se to provede přidáním „*“ do klíčového slova funkce. Poté definujeme funkci nazvanou Add, která přebírá parametr x.
- Klíčové slovo výnos je specifické pro generátory. To z něj dělá mocnou konstrukci pro pozastavení funkce uprostřed čehokoli. Takže zde bude provádění funkce zastaveno, dokud nevyvoláme funkci next (), která se provede v kroku 4. V tomto okamžiku bude hodnota x 6 a provádění funkce bude zastaveno.
- Zde nejprve zavoláme funkci generátoru a pošleme hodnotu 5 do naší funkce Přidat. Tato hodnota bude nahrazena v parametru x naší funkce Přidat.
- 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í.
- Nyní po opětovném volání funkce next () se spustí další příkazy a přidá se a vrátí kombinovaná hodnota x = 5 a y = 6.
Zpětná volání vs. generátory
Generátory se používají k řešení problému takzvaného pekla zpětného volání. Někdy se funkce zpětného volání stanou tak vnořenými během vývoje aplikace Node.js, že je 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í. Pak bychom chtěli volat tuto funkci zahrnující zpoždění 1 000, 2 000 a 3 000 ms.
Krok 1) Definujte naši funkci zpětného volání s nezbytným kódem časového zpoždění.
function Timedelay(ptime, callback) {setTimeout(function() {callback("Pausing for " + ptime);}, time);}
Vysvětlení kódu: -
- Zde vytváříme funkci nazvanou Timedelay s parametrem zvaným ptime. To zabere nezbytné časové zpoždění, které chceme v naší aplikaci zavést.
- Dalším krokem je pouze vytvoření zprávy, která se zobrazí uživateli a řekne, že aplikace bude na tyto mnoho počtů 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í založená na hodnotě 1000, 2000 a 3000 milisekund, níže uvedený kód ukazuje, jak bychom je museli implementovat pomocí zpětných volání.
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: -
- Voláme Timedelay jako zpětné volání s hodnotou 1000.
- Dále chceme znovu zavolat funkci Timedelay s hodnotou 2000.
- Nakonec chceme znovu zavolat funkci Timedelay s hodnotou 3000.
Z výše uvedeného kódu můžete vidět, že se stává messier, protože chceme začít funkci volat 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í vidíte, jak jednoduché se stalo implementovat funkci Timedelay pomocí generátorů.
function* Messages() {console,log(yield(Timedelay(1000, function(){})));console,log(yield(Timedelay(2000, function(){})));console,log(yield(Timedelay(3000, function(){})));}
Vysvětlení kódu: -
- Nejprve definujeme funkci generátoru, která bude použita k volání naší funkce Timedelay.
- Voláme funkci Yield spolu s funkcí Timedelay s 1000 jako hodnotou parametru.
- Poté voláme funkci Yield spolu s funkcí Timedelay s hodnotou parametru 2000.
- Nakonec voláme funkci Yield spolu s funkcí Timedelay s 3000 jako hodnotou parametru.
souhrn
Generátory lze také použít ke zmírnění problémů s vnořenými zpětnými voláními a při odstraňování toho, co se nazývá peklo zpětného volání. Generátory se používají k zastavení zpracování funkce. Toho je dosaženo použitím metody 'yield' v asynchronní funkci.