V tej vadnici boste s pomočjo primerov spoznali generatorje JavaScript.
V JavaScript generatorji ponujajo nov način za delo s funkcijami in iteratorji.
Z uporabo generatorja
- lahko ustavite izvajanje funkcije od kjer koli znotraj funkcije
- in nadaljujte z izvajanjem kode iz ustavljenega položaja
Ustvari generatorje JavaScript
Če želite ustvariti generator, morate najprej definirati funkcijo generatorja s function*
simbolom. Predmeti funkcij generatorja se imenujejo generatorji.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Opomba : Funkcija generatorja je označena z *
. Lahko jih uporabite function* generatorFunc() (… )
ali function *generatorFunc()(… )
ustvarite.
Uporaba donosa za zaustavitev izvrševanja
Kot smo že omenili, lahko zaustavite izvajanje funkcije generatorja, ne da bi zagnali celotno telo funkcije. Za to uporabljamo yield
ključno besedo. Na primer
// 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());
Izhod
1. koda pred prvim donosom (vrednost: 100, narejeno: napačno)
Tukaj,
- Ustvarjen je poimenovan objekt generatorja
generator
. - Ko
generator.next()
je poklican, se izvede koda do prveyield
. Koyield
program naleti, vrne vrednost in zaustavi funkcijo generatorja.
Opomba : Pred uporabo spremenljivki morate dodeliti predmete generatorja.
Obdelava izjav z več donosi
yield
Izraz vrne vrednost. Vendar pa za razliko od return
izjave ne prekine programa. Zato lahko nadaljujete z izvajanjem kode z zadnjega mesta. Na primer
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());
Izhod
1. koda pred prvim donosom (vrednost: 100, dokončano: napačno) 2. koda pred drugim donosom (vrednost: 200, dokončano: napačno) (vrednost: nedefinirano, dokončano: resnično)
Tukaj je opisano, kako deluje ta program.
- Prvi
generator.next()
stavek izvede kodo do prvega stavka yield in zaustavi izvajanje programa. - Drugi
generator.next()
zažene program iz zaustavljenega položaja. - Ko se dostopa do vseh elementov, se vrne (vrednost: nedefinirano, dokončano: resnično).

Prenos argumentov na funkcije generatorja
Argumente lahko posredujete tudi funkciji generatorja. Na primer
// 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());
Izhod
(vrednost: "hello", done: false) 6 nekaj kode (vrednost: 5, done: false) (vrednost: undefined, done: true)
V zgornjem programu
- Prva
generator.next()
vrne vrednostyield
(v tem primeru 'zdravo'). Vendar vrednost ni dodeljena spremenljivki x vlet x = yield 'hello';
(vrednost: "hello", storjeno: false)
- Ko
generator.next(6)
se sreča, se koda znova začne prilet x = yield 'hello';
in argument 6 se dodeli x. Preostala koda se izvrši tudi do sekundeyield
.6 nekaj kode (vrednost: 5, narejeno: napačno)
- Ko
next()
se izvede tretje , se program vrne (vrednost: nedefinirano, končano: resnično). Ker drugih izjav o donosu ni.(vrednost: nedefinirano, končano: resnično)
Generatorji se uporabljajo za implementacijo iterables
Generatorji omogočajo enostavnejši način izvajanja iteratorjev.
Če želite iterator implementirati ročno, morate z next()
metodo ustvariti iterator in shraniti stanje. Na primer
// 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); )
Izhod
1 2 3
Ker so generatorji ponovljivi, lahko iterator implementirate na lažji način. Nato lahko skozi for… of
zanko pregledujete generatorje . Na primer
// 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() | Vrne vrednost donosa |
return() | Vrne vrednost in zaključi generator |
throw() | Vrže napako in zaustavi generator |
Vrnitev JavaScript Vs donos Ključna beseda
vrni ključno besedo | donosna ključna beseda |
---|---|
Vrne vrednost in zaključi funkcijo. | Vrne vrednost in zaustavi funkcijo, vendar funkcije ne zaključi. |
Na voljo v običajnih funkcijah in v funkcijah generatorja. | Na voljo samo v funkcijah generatorja. |
Funkcija generatorja JavaScript z vrnitvijo
return
Stavek lahko uporabite v funkciji generatorja. return
Izjava vrne vrednost in prekine funkcije (podobno rednih nalog). Na primer
// 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());
Izhod
(vrednost: 100, dokončano: napačno) (vrednost: 123, dokončano: resnično) (vrednost: nedefinirano, dokončano: resnično)
V zgornjem programu, ko pride do return
stavka, vrne vrednost in done
lastnost postane true
, funkcija pa se konča. Zato next()
metoda po return
stavku ne vrne ničesar.
Opomba : return()
Metodo lahko uporabite tudi namesto return
stavka, kot je generator.return(123);
v zgornji kodi.
Metoda vrženja JavaScript generatorja
Na funkcijo generatorja lahko izrecno vržete napako z uporabo metode throw (). Uporaba throw()
metode vrže napako in zaključi funkcijo. Na primer
// 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());
Izhod
(vrednost: 1, storjeno: napačno) Napaka: prišlo je do napake.
Uporaba generatorjev
- Generatorji nam omogočajo, da med pisanjem asinhronih opravil napišemo čistejšo kodo.
- Generatorji omogočajo enostavnejši način izvajanja iteratorjev.
- Generatorji izvršijo njeno kodo le, kadar je to potrebno.
- Generatorji so pomnilniško učinkoviti.
Generatorji so bili predstavljeni v ES6 . Nekateri brskalniki morda ne podpirajo uporabe generatorjev. Če želite izvedeti več, obiščite podporo za generatorje JavaScript.