Generátory JavaScriptu

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 yieldkľúč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á, yieldvykoná sa kód až po prvý . Keď yieldsa 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

yieldVýraz vracia hodnotu. Na rozdiel od tohto returnvyhlá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).
Fungovanie funkcie generátora v JavaScripte

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 hodnotu yield(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 na let x = yield 'hello';a argument 6 je priradený k x. Zvyšný kód sa tiež vykoná až do druhého yield.
     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… ofsluč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.

Zaujímavé články...