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 yield
ključ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,yield
izvršava se kôd do prvog . Kadayield
se 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
yield
Izraz vraća vrijednost. Međutim, za razliku od return
izjave, 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).

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 vrijednostyield
(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 slet x = yield 'hello';
i argument 6 dodjeljuje se x. Također, preostali se kôd izvršava do sekundeyield
.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… of
petlju 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.