Tässä opetusohjelmassa opit JavaScript-generaattoreista esimerkkien avulla.
JavaScriptissä generaattorit tarjoavat uuden tavan toimia toimintojen ja iteraattorien kanssa.
Generaattorin avulla
- voit lopettaa toiminnon suorittamisen mistä tahansa toiminnon sisältä
- ja jatka koodin suorittamista pysäytetystä sijainnista
Luo JavaScript-generaattorit
Generaattorin luomiseksi sinun on ensin määritettävä generaattoritoiminto function*
symbolilla. Generaattoritoimintojen objekteja kutsutaan generaattoreiksi.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Huomaa : Generaattorin toiminto on merkitty *
. Voit joko käyttää niitä function* generatorFunc() (… )
tai function *generatorFunc()(… )
luoda niitä.
Tuotto-ohjelman käyttö keskeyttää suoritus
Kuten edellä mainittiin, voit keskeyttää generaattoritoiminnon suorittamisen suorittamatta koko funktion runkoa. Tätä varten käytämme yield
avainsanaa. Esimerkiksi,
// 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());
Tuotos
1. koodi ennen ensimmäistä tuottoa (arvo: 100, valmis: väärä)
Tässä,
- Nimi generaattoriobjekti
generator
luodaan. - Kun
generator.next()
kutsutaan, koodi ensimmäiseen astiyield
suoritetaan. Kunyield
kohtaat, ohjelma palauttaa arvon ja keskeyttää generaattoritoiminnon.
Huomaa : Sinun on määritettävä generaattorikohteet muuttujalle ennen sen käyttöä.
Useiden tuottolausekkeiden käsittely
yield
Ilmaisu palauttaa arvon. Toisin kuin return
lause, se ei kuitenkaan lopeta ohjelmaa. Siksi voit jatkaa koodin suorittamista viimeksi tuotetusta paikasta. Esimerkiksi,
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());
Tuotos
1. koodi ennen ensimmäistä tuottoa (arvo: 100, valmis: väärä) 2. koodi ennen toista tuottoa (arvo: 200, tehty: väärä) (arvo: määrittelemätön, tehty: tosi)
Näin tämä ohjelma toimii.
- Ensimmäinen
generator.next()
käsky suorittaa koodin ensimmäiseen tuottolausekkeeseen saakka ja keskeyttää ohjelman suorittamisen. - Toinen
generator.next()
käynnistää ohjelman taukotilasta. - Kun kaikkia elementtejä käytetään, se palaa (arvo: määrittelemätön, tehty: tosi).

Argumenttien välittäminen generaattoritoiminnoille
Voit myös välittää argumentteja generaattoritoiminnolle. Esimerkiksi,
// 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());
Tuotos
(arvo: "hei", tehty: väärä) 6 jokin koodi (arvo: 5, tehty: väärä) (arvo: määrittelemätön, tehty: tosi)
Yllä olevassa ohjelmassa
- Ensimmäinen
generator.next()
palauttaa arvonyield
(tässä tapauksessa 'hei') arvon. Arvoa ei kuitenkaan ole määritetty muuttujalle xlet x = yield 'hello';
(arvo: "hei", tehty: väärä)
- Kun
generator.next(6)
kohtaat, koodi alkaa uudelleen kohdastalet x = yield 'hello';
ja argumentti 6 osoitetaan x: lle. Myös jäljellä oleva koodi suoritetaan toiseen astiyield
.6 jokin koodi (arvo: 5, tehty: väärä)
- Kun kolmas
next()
on suoritettu, ohjelma palaa (arvo: määrittelemätön, valmis: tosi). Se johtuu siitä, että muita tuottolausekkeita ei ole.(arvo: määrittelemätön, tehty: tosi)
Generaattoreita käytetään itterablettien toteuttamiseen
Generaattorit tarjoavat helpomman tavan toteuttaa iteraattorit.
Jos haluat ottaa iteraattorin käyttöön manuaalisesti, sinun on luotava iteraattori next()
menetelmällä ja tallennettava tila. Esimerkiksi,
// 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); )
Tuotos
1 2 3
Koska generaattorit ovat iteroivia, voit ottaa iteraattorin käyttöön helpommalla tavalla. Sitten voit toistaa generaattoreiden läpi for… of
silmukan avulla. Esimerkiksi,
// generator function function* generatorFunc() ( yield 1; yield 2; yield 3; ) const obj = generatorFunc(); // iteration through generator for (let value of obj) ( console.log(value); )
Generaattorimenetelmät
Menetelmä | Kuvaus |
---|---|
next() | Palauttaa tuottoarvon |
return() | Palauttaa arvon ja lopettaa generaattorin |
throw() | Heittää virheen ja sulkee generaattorin |
JavaScript palauttaa Vs-tuoton avainsanan
palauta avainsana | tuotto Avainsana |
---|---|
Palauttaa arvon ja lopettaa toiminnon. | Palauttaa arvon ja keskeyttää toiminnon, mutta ei lopeta toimintoa. |
Saatavana sekä normaalitoiminnoissa että generaattoritoiminnoissa. | Saatavana vain generaattoritoiminnoissa. |
JavaScript-generaattorin toiminto paluu
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
Voit heittää virheen generaattoritoiminnolle käyttämällä heittää () -menetelmää. Menetelmän käyttö throw()
heittää virheen ja lopettaa toiminnon. Esimerkiksi,
// 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());
Tuotos
(arvo: 1, valmis: väärä) Virhe: Tapahtui virhe.
Generaattoreiden käyttö
- Generaattorit antavat meille kirjoittaa puhtaampaa koodia kirjoittaessamme asynkronisia tehtäviä.
- Generaattorit tarjoavat helpomman tavan toteuttaa iteraattorit.
- Generaattorit suorittavat koodinsa vain tarvittaessa.
- Generaattorit ovat muistitehokkaita.
Generaattorit esiteltiin ES6: ssa . Jotkin selaimet eivät ehkä tue generaattorien käyttöä. Jos haluat lisätietoja, käy JavaScript-generaattoreiden tuessa.