Šioje pamokoje su pavyzdžių pagalba sužinosite apie „JavaScript“ generatorius.
„JavaScript“ generatoriai suteikia naują būdą dirbti su funkcijomis ir iteratoriais.
Naudodamas generatorių,
- galite sustabdyti funkcijos vykdymą iš bet kurios funkcijos vietos
- ir toliau vykdykite kodą iš sustabdytos padėties
Sukurkite „JavaScript“ generatorius
Norėdami sukurti generatorių, pirmiausia turite apibrėžti generatoriaus funkciją su function*
simboliu. Generatoriaus funkcijų objektai vadinami generatoriais.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Pastaba : generatoriaus funkcija žymima *
. Galite juos naudoti function* generatorFunc() (… )
arba function *generatorFunc()(… )
sukurti.
Derliaus naudojimas vykdymo pristabdymui
Kaip minėta aukščiau, galite pristabdyti generatoriaus funkcijos vykdymą, nevykdydami viso funkcijos korpuso. Tam mes naudojame yield
raktinį žodį. Pavyzdžiui,
// 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());
Rezultatas
1. kodas prieš pirmąjį pelningumą (vertė: 100, padaryta: klaidinga)
Čia
- Sukurtas generatoriaus objektas, pavadintas
generator
. - Kai
generator.next()
iškviečiamas, vykdomas kodas iki pirmojoyield
. Kaiyield
susiduriama, programa grąžina vertę ir pristabdo generatoriaus funkciją.
Pastaba : Prieš naudodami kintamąjį turite priskirti generatoriaus objektus.
Daugelio pelningumo ataskaitų kūrimas
yield
Išraiška grąžina reikšmę. Tačiau, skirtingai nei return
teiginys, jis nenutraukia programos. Štai kodėl galite tęsti kodo vykdymą iš paskutinės gautos pozicijos. Pavyzdžiui,
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());
Rezultatas
1. kodas prieš pirmąjį pelningumą (vertė: 100, padaryta: klaidinga) 2. kodas prieš antrą pajamingumą (vertė: 200, padaryta: klaidinga) (reikšmė: neapibrėžta, padaryta: tiesa)
Štai kaip ši programa veikia.
- Pirmasis
generator.next()
sakinys įvykdo kodą iki pirmojo pajamingumo teiginio ir pristabdo programos vykdymą. - Antrasis
generator.next()
pradeda programą iš pristabdytos padėties. - Kai pasiekiami visi elementai, jis grįžta (reikšmė: neapibrėžta, padaryta: tiesa).

Argumentų perdavimas generatoriaus funkcijoms
Taip pat galite perduoti argumentus generatoriaus funkcijai. Pavyzdžiui,
// 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());
Rezultatas
(reikšmė: „labas“, padaryta: klaidinga) 6 tam tikras kodas (vertė: 5, padaryta: klaidinga) (reikšmė: neapibrėžta, padaryta: tiesa)
Pirmiau pateiktoje programoje
- Pirmasis
generator.next()
grąžina reikšmęyield
(šiuo atveju „labas“). Tačiau reikšmė kintamajam x nepriskiriamalet x = yield 'hello';
(vertė: „labas“, padaryta: klaidinga)
- Kai
generator.next(6)
susiduriama, kodas vėl prasidedalet x = yield 'hello';
ir argumentas 6 priskiriamas x. Be to, likęs kodas vykdomas iki antrojoyield
.6 kodas (vertė: 5, padaryta: klaidinga)
- Vykdžius trečią
next()
, programa grįžta (reikšmė: neapibrėžta, padaryta: tiesa). Taip yra todėl, kad nėra kitų pelningumo ataskaitų.(vertė: neapibrėžta, padaryta: tiesa)
Generatoriai naudojami diegiant „Iterables“
Generatoriai suteikia lengvesnį iteratorių diegimo būdą.
Jei norite iteratorių įdiegti rankiniu būdu, turite sukurti iteratorių su next()
metodu ir išsaugoti būseną. Pavyzdžiui,
// 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); )
Rezultatas
1 2 3
Kadangi generatoriai yra kartojami, galite lengviau įdiegti iteratorių. Tada galite kartoti generatorius naudodami for… of
kilpą. Pavyzdžiui,
// generator function function* generatorFunc() ( yield 1; yield 2; yield 3; ) const obj = generatorFunc(); // iteration through generator for (let value of obj) ( console.log(value); )
Generatoriaus metodai
Metodas | apibūdinimas |
---|---|
next() | Grąžina derliaus vertę |
return() | Grąžina vertę ir nutraukia generatorių |
throw() | Išmeta klaidą ir nutraukia generatorių |
„JavaScript“ grąžina „Vs“ raktinį žodį
grąžinti raktinį žodį | derliaus raktinis žodis |
---|---|
Grąžina vertę ir nutraukia funkciją. | Grąžina vertę ir sustabdo funkciją, bet funkcijos nenutraukia. |
Galima tiek įprastomis, tiek generatoriaus funkcijomis. | Galima tik naudojant generatoriaus funkcijas. |
„JavaScript“ generatoriaus funkcija su grąža
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
Naudodami metimo () metodą, galite aiškiai mesti generatoriaus funkcijos klaidą. Naudojimo throw()
būdą meta klaidą ir nutraukia funkciją. Pavyzdžiui,
// 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());
Rezultatas
(reikšmė: 1, padaryta: klaidinga) Klaida: įvyko klaida.
Generatorių naudojimas
- Generatoriai leido mums rašyti švaresnį kodą rašant asinchronines užduotis.
- Generatoriai suteikia lengvesnį iteratorių diegimo būdą.
- Generatoriai vykdo jo kodą tik tada, kai to reikia.
- Generatoriai taupo atmintį.
Generatoriai buvo pristatyti ES6 . Kai kurios naršyklės gali nepalaikyti generatorių naudojimo. Norėdami sužinoti daugiau, apsilankykite „JavaScript“ generatorių palaikymo tarnyboje.