Generátory JavaScriptu

V tomto kurzu se na příkladech dozvíte o generátorech JavaScriptu.

V JavaScriptu generátory poskytují nový způsob práce s funkcemi a iterátory.

Pomocí generátoru

  • můžete zastavit provádění funkce odkudkoli uvnitř funkce
  • a pokračujte ve spouštění kódu ze zastavené polohy

Vytvořte generátory JavaScriptu

Chcete-li vytvořit generátor, musíte nejprve definovat funkci generátoru se function*symbolem. Objekty funkcí generátoru se nazývají generátory.

 // define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();

Poznámka : Funkce generátoru je označena *. Můžete je použít function* generatorFunc() (… )nebo function *generatorFunc()(… )k jejich vytvoření.

Použití výnosu k pozastavení provádění

Jak již bylo zmíněno výše, můžete pozastavit provádění funkce generátoru bez provedení celého těla funkce. K tomu používáme yieldklíčové slovo. Například,

 // generator function function* generatorFunc() ( console.log("1. code before the first yield"); yield 100; console.log("2. code before the second yield"); yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next());

Výstup

 1. kód před prvním výnosem (hodnota: 100, hotovo: false)

Tady,

  • Vytvoří se pojmenovaný objekt generátoru generator.
  • Při generator.next()volání se provede kód až do prvního yield. Když yieldse setká, program vrátí hodnotu a pozastaví funkci generátoru.

Poznámka : Před použitím proměnné je třeba přiřadit objekty generátoru.

Práce s více výkazy výnosů

yieldVýraz vrací hodnotu. Na rozdíl od tohoto returnprohlášení však program neukončí. Proto můžete pokračovat v provádění kódu z poslední získané pozice. Například,

 function* generatorFunc() ( console.log("1. code before first yield"); yield 100; console.log("2. code before the second yield"); yield 200; console.log("3. code after the second yield"); ) const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next()); console.log(generator.next());

Výstup

 1. kód před prvním výnosem (hodnota: 100, hotovo: false) 2. kód před druhým výnosem (hodnota: 200, hotovo: false) (hodnota: nedefinováno, hotovo: true)

Takto funguje tento program.

  • První generator.next()příkaz provede kód až do prvního příkazu k výtěžku a pozastaví provádění programu.
  • Druhý generator.next()spustí program z pozastavené pozice.
  • Když jsou přístupné všechny prvky, vrátí se (hodnota: nedefinováno, hotovo: pravda).
Práce s funkcí generátoru v JavaScriptu

Předávání argumentů funkcím generátoru

Můžete také předat argumenty funkci generátoru. Například,

 // generator function function* generatorFunc() ( // returns 'hello' at first next() let x = yield 'hello'; // returns passed argument on the second next() console.log(x); console.log('some code'); // returns 5 on second next() yield 5; ) const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next(6)); console.log(generator.next());

Výstup

 (hodnota: „ahoj“, hotovo: false) 6 nějaký kód (hodnota: 5, hotovo: false) (hodnota: nedefinováno, hotovo: true)

Ve výše uvedeném programu

  • První generator.next()vrací hodnotu yield(v tomto případě „ahoj“). Hodnota však není přiřazena proměnné x vlet x = yield 'hello';
     (hodnota: „ahoj“, hotovo: nepravda)
  • Když generator.next(6)se setká, kód znovu začíná v let x = yield 'hello';a argument 6 je přiřazen k x. Zbývající kód se také provede až do druhého yield.
     6 nějaký kód (hodnota: 5, hotovo: false)
  • Když je třetí next()spuštěn, program se vrátí (hodnota: nedefinováno, hotovo: pravda). Je to proto, že neexistují žádné jiné výkazy výnosů.
     (hodnota: nedefinováno, hotovo: true)

Generátory se používají pro implementaci Iterables

Generátory poskytují snadnější způsob implementace iterátorů.

Pokud chcete implementovat iterátor ručně, musíte vytvořit iterátor s next()metodou a uložit stav. Například,

 // creating iterable object const iterableObj = ( // iterator method (Symbol.iterator)() ( let step = 0; return ( next() ( step++; if (step === 1) ( return ( value: '1', done: false); ) else if (step === 2) ( return ( value: '2', done: false); ) else if (step === 3) ( return ( value: '3', done: false); ) return ( value: '', done: true ); ) ) ) ) for (const i of iterableObj) ( console.log(i); )

Výstup

 1 2 3

Protože generátory jsou iterovatelné, můžete iterátor implementovat jednodušším způsobem. Potom můžete iterovat generátory pomocí for… ofsmyčky. Například,

 // generator function function* generatorFunc() ( yield 1; yield 2; yield 3; ) const obj = generatorFunc(); // iteration through generator for (let value of obj) ( console.log(value); )

Metody generátoru

Metoda Popis
next() Vrátí hodnotu výtěžku
return() Vrátí hodnotu a ukončí generátor
throw() Vyvolá chybu a ukončí generátor

Klíčové slovo s návratem JavaScript Vs

vrátit klíčové slovo výtěžek Klíčové slovo
Vrátí hodnotu a ukončí funkci. Vrátí hodnotu a zastaví funkci, ale funkci neukončí.
K dispozici v normálních i generátorových funkcích. K dispozici pouze ve funkcích generátoru.

Funkce generátoru JavaScriptu s návratem

Příkaz můžete použít returnve funkci generátoru. Příkaz returnvrátí hodnotu a ukončí funkci (podobně jako běžné funkce). Například,

 // generator function function* generatorFunc() ( yield 100; return 123; console.log("2. some code before second yield"); yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next()); console.log(generator.next());

Výstup

 (hodnota: 100, hotovo: false) (hodnota: 123, hotovo: true) (hodnota: nedefinováno, hotovo: true)

Ve výše uvedeném programu, když je returnpříkaz nalezen, vrátí hodnotu a donevlastnost se stane truea funkce se ukončí. Proto je next()metoda po returnprohlášení nic nevrací.

Poznámka : Můžete také použít return()metodu namísto returnpříkazu jako generator.return(123);ve výše uvedeném kódu.

Metoda vyvolání generátoru JavaScriptu

Můžete explicitně hodit chybu na funkci generátoru pomocí metody throw (). Použití throw()metody vyvolá chybu a ukončí funkci. Například,

 // generator function function* generatorFunc() ( yield 100; yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next()); // throws an error // terminates the generator console.log(generator.throw(new Error('Error occurred.'))); console.log(generator.next());

Výstup

 (hodnota: 1, hotovo: false) Chyba: Došlo k chybě.

Použití generátorů

  • Generátory nám umožňují psát čistší kód při psaní asynchronních úkolů.
  • Generátory poskytují snadnější způsob implementace iterátorů.
  • Generátoři provádějí jeho kód pouze v případě potřeby.
  • Generátory jsou paměťově efektivní.

Generátory byly představeny v ES6 . Některé prohlížeče nemusí podporovat použití generátorů. Další informace najdete na podpoře generátorů JavaScriptu.

Zajímavé články...