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 yield
klíč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íhoyield
. Kdyžyield
se 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ů
yield
Výraz vrací hodnotu. Na rozdíl od tohoto return
prohláš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).

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í hodnotuyield
(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á vlet x = yield 'hello';
a argument 6 je přiřazen k x. Zbývající kód se také provede až do druhéhoyield
.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… of
smyč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 return
ve funkci generátoru. Příkaz return
vrá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 return
příkaz nalezen, vrátí hodnotu a done
vlastnost se stane true
a funkce se ukončí. Proto je next()
metoda po return
prohlášení nic nevrací.
Poznámka : Můžete také použít return()
metodu namísto return
pří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.