JavaScript generatori

U ovom ćete uputstvu uz primjere naučiti o JavaScript generatorima.

U JavaScriptu generatori pružaju novi način rada s funkcijama i iteratorima.

Korištenjem generatora,

  • izvršavanje funkcije možete zaustaviti s bilo kojeg mjesta unutar funkcije
  • i nastavite izvršavati kod iz zaustavljenog položaja

Stvorite JavaScript generatore

Da biste stvorili generator, prvo morate definirati funkciju generatora function*simbolom. Objekti funkcija generatora nazivaju se generatori.

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

Napomena : Funkcija generatora označena je s *. Možete ih koristiti function* generatorFunc() (… )ili function *generatorFunc()(… )za njihovo stvaranje.

Korištenje prinosa za zaustavljanje izvršenja

Kao što je gore spomenuto, možete pauzirati izvršavanje funkcije generatora bez izvršavanja cijelog tijela funkcije. Za to koristimo yieldključnu riječ. Na primjer,

 // 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());

Izlaz

 1. kôd prije prvog prinosa (vrijednost: 100, gotovo: netačno)

Ovdje,

  • Stvara se imenovani objekt generatora generator.
  • Kada generator.next()se pozove, yieldizvršava se kôd do prvog . Kada yieldse susretne, program vraća vrijednost i zaustavlja funkciju generatora.

Napomena : Morate dodijeliti generacijske objekte varijabli prije nego što je upotrijebite.

Izrada višestrukih izjava o prinosu

yieldIzraz vraća vrijednost. Međutim, za razliku od returnizjave, ona ne prekida program. Zbog toga možete nastaviti izvršavati kôd sa zadnjeg ustupljenog položaja. Na primjer,

 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());

Izlaz

 1. kod prije prvog prinosa (vrijednost: 100, gotovo: netačno) 2. kod prije drugog prinosa (vrijednost: 200, gotovo: netačno) (vrijednost: nedefinirano, gotovo: točno)

Evo kako ovaj program radi.

  • Prva generator.next()naredba izvršava kôd do prve naredbe yield i zaustavlja izvršavanje programa.
  • Druga generator.next()pokreće program iz pauziranog položaja.
  • Kada se pristupi svim elementima, vraća se (vrijednost: nedefinirano, gotovo: istina).
Rad funkcije generatora u JavaScript-u

Prosljeđivanje argumenata na funkcije generatora

Također možete proslijediti argumente funkciji generatora. Na primjer,

 // 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());

Izlaz

 (vrijednost: "zdravo", gotovo: netačno) 6 neki kod (vrijednost: 5, gotovo: netačno) (vrijednost: nedefinirano, gotovo: točno)

U gornjem programu,

  • Prvi generator.next()vraća vrijednost yield(u ovom slučaju, 'zdravo'). Međutim, vrijednost nije dodijeljena varijabli x ulet x = yield 'hello';
     (vrijednost: "zdravo", gotovo: netačno)
  • Kada generator.next(6)se susretne, kod ponovno započinje s let x = yield 'hello';i argument 6 dodjeljuje se x. Također, preostali se kôd izvršava do sekunde yield.
     6 neki kod (vrijednost: 5, gotovo: netačno)
  • Kad next()se izvrši treća , program se vraća (vrijednost: nedefinirano, gotovo: istina). To je zato što ne postoje druge izjave o prinosu.
     (vrijednost: nedefinirano, gotovo: točno)

Generatori se koriste za implementaciju inteterable-a

Generatori pružaju lakši način implementacije iteratora.

Ako želite ručno implementirati iterator, morate stvoriti iterator s next()metodom i spremiti stanje. Na primjer,

 // 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); )

Izlaz

 1 2 3

Budući da su generatori iterabilni, iterator možete implementirati na lakši način. Tada for… ofpetlju možete generirati kroz generatore . Na primjer,

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

Generatorske metode

Metoda Opis
next() Vraća vrijednost prinosa
return() Vraća vrijednost i završava generator
throw() Baca pogrešku i isključuje generator

JavaScript povratak Vs donosi Ključna riječ

return Ključna riječ yield Ključna riječ
Vraća vrijednost i završava funkciju. Vraća vrijednost i zaustavlja funkciju, ali ne prekida funkciju.
Dostupno u normalnim funkcijama i funkcijama generatora. Dostupno samo u funkcijama generatora.

JavaScript generator funkcija s povratkom

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

Možete izričito baciti pogrešku na funkciju generatora pomoću metode throw (). Upotreba throw()metode dovodi do pogreške i prekida funkciju. Na primjer,

 // 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());

Izlaz

 (vrijednost: 1, gotovo: netačno) Pogreška: Dogodila se pogreška.

Uporaba generatora

  • Generatori nam pišu čistiji kod dok pišemo asinkrone zadatke.
  • Generatori pružaju lakši način implementacije iteratora.
  • Generatori izvršavaju njegov kod samo kada je to potrebno.
  • Generatori su učinkoviti u memoriji.

Generatori su predstavljeni u ES6 . Neki preglednici možda ne podržavaju upotrebu generatora. Da biste saznali više, posjetite podršku za JavaScript generatore.

Zanimljivi članci...