V tomto výučbe sa na príkladoch dozviete o generátoroch JavaScriptu.
V JavaScripte poskytujú generátory nový spôsob práce s funkciami a iterátormi.
Pomocou generátora
- vykonávanie funkcie môžete zastaviť kdekoľvek vo vnútri funkcie
- a pokračujte v vykonávaní kódu zo zastavenej polohy
Vytvorte generátory JavaScriptu
Ak chcete vytvoriť generátor, musíte najskôr definovať funkciu generátora so function*
symbolom. Objekty funkcií generátora sa nazývajú generátory.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Poznámka : Funkcia generátora je označená *
. Môžete ich použiť function* generatorFunc() (… )
alebo function *generatorFunc()(… )
na ich vytvorenie.
Použitie výnosu na pozastavenie vykonania
Ako už bolo spomenuté vyššie, vykonávanie funkcie generátora môžete pozastaviť bez vykonania celého tela funkcie. Na to používame yield
kľúčové slovo. Naprí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ýkon
1. kód pred prvým výnosom (hodnota: 100, hotovo: false)
Tu,
- Vytvorí sa objekt generátora
generator
. - Keď
generator.next()
sa zavolá,yield
vykoná sa kód až po prvý . Keďyield
sa vyskytne, program vráti hodnotu a pozastaví funkciu generátora.
Poznámka : Pred použitím premennej musíte priradiť objekty generátora.
Spracovanie viacerých výkazov výnosov
yield
Výraz vracia hodnotu. Na rozdiel od tohto return
vyhlásenia však program neukončuje. Preto môžete pokračovať v spúšťaní kódu z poslednej získanej pozície. Naprí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ýkon
1. kód pred prvým výnosom (hodnota: 100, hotovo: false) 2. kód pred druhým výnosom (hodnota: 200, hotovo: false) (hodnota: nedefinované, hotovo: true)
Takto funguje tento program.
- Prvý
generator.next()
príkaz vykoná kód až po prvý príkaz na výťažok a pozastaví vykonávanie programu. - Druhý
generator.next()
program spustí z pozastavenej polohy. - Po prístupe ku všetkým prvkom sa vráti (hodnota: nedefinované, urobené: pravda).

Predávanie argumentov funkciám generátora
Argumenty môžete tiež odovzdať funkcii generátora. Naprí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ýkon
(hodnota: „ahoj“, hotovo: nepravda) 6 nejaký kód (hodnota: 5, hotovo: nepravda) (hodnota: nedefinované, hotovo: true)
Vo vyššie uvedenom programe
- Prvý
generator.next()
vracia hodnotuyield
(v tomto prípade „ahoj“). Hodnota však nie je priradená premennej x vlet x = yield 'hello';
(hodnota: „ahoj“, hotovo: nepravda)
- Keď
generator.next(6)
sa vyskytne, kód opäť začína nalet x = yield 'hello';
a argument 6 je priradený k x. Zvyšný kód sa tiež vykoná až do druhéhoyield
.6 nejaký kód (hodnota: 5, hotovo: false)
- Po vykonaní tretieho
next()
sa program vráti (hodnota: nedefinované, urobené: pravda). Je to preto, lebo neexistujú žiadne ďalšie výkazy výnosov.(hodnota: nedefinované, hotové: pravda)
Generátory sa používajú na implementáciu tabuliek
Generátory poskytujú ľahší spôsob implementácie iterátorov.
Ak chcete implementovať iterátor manuálne, musíte vytvoriť iterátor s next()
metódou a uložiť stav. Naprí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ýkon
1 2 3
Pretože generátory sú iterovateľné, môžete implementovať iterátor jednoduchším spôsobom. Potom môžete iterovať cez generátory pomocou for… of
slučky. Naprí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); )
Metódy generátora
Metóda | Popis |
---|---|
next() | Vráti hodnotu výťažku |
return() | Vráti hodnotu a ukončí generátor |
throw() | Vyvolá chybu a ukončí generátor |
Kľúčové slovo s návratnosťou vs JavaScript
vrátiť kľúčové slovo | výťažok Kľúčové slovo |
---|---|
Vráti hodnotu a ukončí funkciu. | Vráti hodnotu a zastaví funkciu, ale funkciu neukončí. |
K dispozícii v normálnych aj generátorových funkciách. | K dispozícii iba vo funkciách generátora. |
Funkcia generátora JavaScriptu s návratom
You can use the return
statement in a generator function. The return
statement returns a value and terminates the function (similar to regular functions). For example,
// 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());
Output
(value: 100, done: false) (value: 123, done: true) (value: undefined, done: true)
In the above program, when the return
statement is encountered, it returns the value and done
property becomes true
, and the function terminates. Hence, the next()
method after the return
statement does not return anything.
Note: You can also use the return()
method instead of the return
statement like generator.return(123);
in the above code.
JavaScript Generator Throw Method
Pomocou funkcie throw () môžete explicitne vyvolať chybu vo funkcii generátora. Použitie throw()
metódy vyvolá chybu a ukončí funkciu. Naprí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ýkon
(hodnota: 1, hotovo: false) Chyba: Vyskytla sa chyba.
Použitie generátorov
- Generátory nám umožňujú písať čistejší kód pri písaní asynchrónnych úloh.
- Generátory poskytujú ľahší spôsob implementácie iterátorov.
- Generátory vykonávajú jeho kód iba v prípade potreby.
- Generátory sú efektívne z hľadiska pamäte.
Generátory boli predstavené v ES6 . Niektoré prehliadače nemusia podporovať použitie generátorov. Ak sa chcete dozvedieť viac, navštívte podporu generátorov JavaScript.