Selles õpetuses saate näidete abil õppida JavaScripti generaatorite kohta.
JavaScriptis pakuvad generaatorid uut viisi funktsioonide ja iteraatoritega töötamiseks.
Generaatori abil
- funktsiooni täitmise saate peatada kõikjal funktsiooni sees
- ja jätkake koodi peatatud positsioonilt täitmist
Looge JavaScripti generaatorid
Generaatori loomiseks peate kõigepealt määratlema generaatori funktsiooni koos function*
sümboliga. Generaatori funktsioonide objekte nimetatakse generaatoriteks.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Märkus . Generaatori funktsiooni tähistatakse *
. Nende loomiseks võite kasutada kas neid function* generatorFunc() (… )
või function *generatorFunc()(… )
.
Saagi kasutamine täitmise peatamiseks
Nagu eespool mainitud, saate peatada generaatori funktsiooni täitmise ilma kogu funktsiooni keha käivitamata. Selleks kasutame yield
märksõna. Näiteks,
// 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äljund
1. kood enne esimest tootlust (väärtus: 100, valmis: vale)
Siin,
- Luuakse nimega generaatorobjekt
generator
. - Kui
generator.next()
kutsutakse,yield
käivitatakse kood kuni esimeseni . Kuiyield
see tekib, tagastab programm väärtuse ja peatab generaatori funktsiooni.
Märkus . Muutujale peate enne selle kasutamist määrama generaatori objektid.
Mitme tootluse avalduse töötamine
yield
Väljend tagastab väärtuse. Kuid erinevalt return
avaldusest ei lõpe see programmi. Sellepärast saate jätkata koodi täitmist viimaselt saadud positsioonilt. Näiteks,
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äljund
1. kood enne esimest tootlust (väärtus: 100, valmis: vale) 2. kood enne teist tulu (väärtus: 200, valmis: vale) (väärtus: määratlemata, tehtud: tõene)
See programm töötab nii.
- Esimene
generator.next()
lause täidab koodi kuni esimese tootluslauseni ja peatab programmi täitmise. - Teine
generator.next()
käivitab programmi peatatud asendist. - Kõigi elementide juurde pääsemisel naaseb see (väärtus: määratlemata, tehtud: tõene).

Argumentide edastamine generaatori funktsioonidele
Argumente saate edastada ka generaatori funktsioonile. Näiteks,
// 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äljund
(väärtus: "tere", valmis: vale) 6 mingi kood (väärtus: 5, tehtud: vale) (väärtus: määratlemata, tehtud: tõene)
Ülaltoodud programmis
- Esimene
generator.next()
tagastab väärtuseyield
(antud juhul 'tere'). Väärtust ei omistata muutujale xlet x = yield 'hello';
(väärtus: "tere", tehtud: vale)
- Kui
generator.next(6)
see kohtub, algab kood uuesti punktistlet x = yield 'hello';
ja argument 6 määratakse x-le. Samuti käivitatakse ülejäänud kood kuni sekundiniyield
.6 mõni kood (väärtus: 5, tehtud: vale)
- Kui kolmas
next()
on täidetud, naaseb programm (väärtus: määratlemata, tehtud: tõene). Sellepärast, et muid tootlusaruandeid pole.(väärtus: määratlemata, tehtud: tõene)
Generaatoreid kasutatakse itterable'i rakendamiseks
Generaatorid pakuvad iteraatorite juurutamiseks lihtsamat viisi.
Kui soovite iteraatorit käsitsi rakendada, peate looma next()
meetodiga iteraatori ja oleku salvestama. Näiteks,
// 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äljund
1 2 3
Kuna generaatorid on korduvad, saate iteraatorit hõlpsamalt rakendada. Siis saate for… of
tsükli abil generaatorite kaudu itereerida . Näiteks,
// generator function function* generatorFunc() ( yield 1; yield 2; yield 3; ) const obj = generatorFunc(); // iteration through generator for (let value of obj) ( console.log(value); )
Generaatori meetodid
Meetod | Kirjeldus |
---|---|
next() | Tagastab saagise väärtuse |
return() | Tagastab väärtuse ja lõpetab generaatori |
throw() | Viskab vea ja lõpetab generaatori |
JavaScripti tagastamine Vs annab märksõna
tagastage märksõna | saagis märksõna |
---|---|
Tagastab väärtuse ja lõpetab funktsiooni. | Tagastab väärtuse ja peatab funktsiooni, kuid ei lõpe funktsiooni. |
Saadaval nii tavaliste kui ka generaatorfunktsioonidena. | Saadaval ainult generaatori funktsioonides. |
JavaScripti generaatori funktsioon koos tagastusega
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
Võite visata generaatori funktsioonile vea, kasutades meetodit thr (). Meetodi kasutamine throw()
loob vea ja lõpetab funktsiooni. Näiteks,
// 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äljund
(väärtus: 1, valmis: vale) Viga: tekkis viga.
Generaatorite kasutamine
- Generaatorid lasevad meil asünkroonsete ülesannete kirjutamise ajal kirjutada puhtama koodi.
- Generaatorid pakuvad iteraatorite juurutamiseks lihtsamat viisi.
- Generaatorid täidavad selle koodi ainult vajaduse korral.
- Generaatorid on mälusäästlikud.
Generaatorid võeti kasutusele ES6-s . Mõni brauser ei pruugi generaatorite kasutamist toetada. Lisateabe saamiseks külastage JavaScripti generaatorite tugiteenust.