„JavaScript“ generatoriai

Š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 yieldraktinį ž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 pirmojo yield. Kai yieldsusiduriama, programa grąžina vertę ir pristabdo generatoriaus funkciją.

Pastaba : Prieš naudodami kintamąjį turite priskirti generatoriaus objektus.

Daugelio pelningumo ataskaitų kūrimas

yieldIšraiška grąžina reikšmę. Tačiau, skirtingai nei returnteiginys, 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).
Generatoriaus funkcijos veikimas „JavaScript“

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 prasideda let x = yield 'hello';ir argumentas 6 priskiriamas x. Be to, likęs kodas vykdomas iki antrojo yield.
     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… ofkilpą. 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.

Įdomios straipsniai...