I denne veiledningen vil du lære om JavaScript-generatorer ved hjelp av eksempler.
I JavaScript gir generatorer en ny måte å jobbe med funksjoner og iteratorer på.
Ved hjelp av en generator,
- du kan stoppe utførelsen av en funksjon fra hvor som helst i funksjonen
- og fortsett å utføre kode fra en stoppet posisjon
Opprett JavaScript-generatorer
For å lage en generator, må du først definere en generatorfunksjon med function*
symbol. Objektene til generatorfunksjonene kalles generatorer.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Merk : Generatorfunksjonen er betegnet med *
. Du kan enten bruke function* generatorFunc() (… )
eller function *generatorFunc()(… )
lage dem.
Bruke avkastning for å pause utførelse
Som nevnt ovenfor kan du stoppe utførelsen av en generatorfunksjon midlertidig uten å utføre hele funksjonsdelen. Til det bruker vi yield
nøkkelordet. For eksempel,
// 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());
Produksjon
1. kode før første avkastning (verdi: 100, ferdig: usann)
Her,
- Et generatorobjekt med navn
generator
blir opprettet. - Når
generator.next()
kalles, blir koden frem til den førsteyield
utført. Nåryield
det oppstår, returnerer programmet verdien og stopper generatorfunksjonen midlertidig.
Merk : Du må tilordne generatorobjekter til en variabel før du bruker den.
Arbeid med flere avkastningsuttalelser
Den yield
uttrykk, returnerer en verdi. I motsetning til return
uttalelsen avslutter det imidlertid ikke programmet. Det er derfor du kan fortsette å utføre kode fra den sist ga posisjonen. For eksempel,
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());
Produksjon
1. kode før første avkastning (verdi: 100, utført: usann) 2. kode før andre utbytte (verdi: 200, utført: usann) (verdi: udefinert, utført: sann)
Slik fungerer dette programmet.
- Den første
generator.next()
uttalelsen utfører koden frem til den første avkastningen og stopper gjennomføringen av programmet. - Det andre
generator.next()
starter programmet fra pause. - Når alle elementene er tilgjengelige, returnerer den (verdi: udefinert, ferdig: sann).

Overføring av argumenter til generatorfunksjoner
Du kan også overføre argumenter til en generatorfunksjon. For eksempel,
// 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());
Produksjon
(verdi: "hei", gjort: usann) 6 noe kode (verdi: 5, gjort: usann) (verdi: udefinert, gjort: sant)
I programmet ovenfor,
- Den første
generator.next()
returnerer verdien avyield
(i dette tilfellet 'hallo'). Verdien tildeles imidlertid ikke variabelen x ilet x = yield 'hello';
(verdi: "hei", gjort: usann)
- Når
generator.next(6)
det oppstår, starter koden igjen kllet x = yield 'hello';
og argumentet 6 tildeles x. Også gjenværende kode utføres frem til andreyield
.6 noe kode (verdi: 5, ferdig: usann)
- Når den tredje
next()
kjøres, returnerer programmet (verdi: udefinert, ferdig: sant). Det er fordi det ikke er andre avkastningsuttalelser.(verdi: udefinert, ferdig: sant)
Generatorer brukes til å implementere Iterables
Generatorer gir en enklere måte å implementere iteratorer på.
Hvis du vil implementere en iterator manuelt, må du opprette en iterator med next()
metoden og lagre tilstanden. For eksempel,
// 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); )
Produksjon
1 2 3
Siden generatorer er iterables, kan du implementere en iterator på en enklere måte. Deretter kan du gjenta gjennom generatorene ved hjelp av for… of
løkken. For eksempel,
// generator function function* generatorFunc() ( yield 1; yield 2; yield 3; ) const obj = generatorFunc(); // iteration through generator for (let value of obj) ( console.log(value); )
Generatormetoder
Metode | Beskrivelse |
---|---|
next() | Returnerer en avkastningsverdi |
return() | Returnerer en verdi og avslutter generatoren |
throw() | Kaster en feil og avslutter generatoren |
JavaScript return Vs yield Keyword
return Keyword | gi nøkkelord |
---|---|
Returnerer verdien og avslutter funksjonen. | Returnerer verdien og stopper funksjonen, men avslutter ikke funksjonen. |
Tilgjengelig i både de vanlige funksjonene og generatorfunksjonene. | Bare tilgjengelig i generatorfunksjoner. |
JavaScript-generatorfunksjon med retur
Du kan bruke return
setningen i en generatorfunksjon. Den return
setningen returnerer en verdi og avslutter funksjonen (ligner på vanlige funksjoner). For eksempel,
// 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());
Produksjon
(verdi: 100, utført: usann) (verdi: 123, utført: sann) (verdi: udefinert, utført: sann)
I det ovennevnte programmet, når return
utsagnet oppstår, returnerer det verdien og done
egenskapen blir true
, og funksjonen avsluttes. Derfor gir next()
metoden etter return
uttalelsen ikke noe.
Merk : Du kan også bruke return()
metoden i stedet for return
utsagnet som generator.return(123);
i koden ovenfor.
JavaScript-generator kastemetode
Du kan eksplisitt kaste en feil på generatorfunksjonen ved hjelp av throw () -metoden. Bruken av throw()
metoden kaster en feil og avslutter funksjonen. For eksempel,
// 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());
Produksjon
(verdi: 1, ferdig: usann) Feil: Det oppstod en feil.
Bruk av generatorer
- Generatorer lar oss skrive renere kode mens vi skriver asynkrone oppgaver.
- Generatorer gir en enklere måte å implementere iteratorer på.
- Generatorer utfører bare koden når det er nødvendig.
- Generatorer er minneeffektive.
Generatorer ble introdusert i ES6 . Noen nettlesere støtter kanskje ikke bruk av generatorer. Hvis du vil lære mer, kan du gå til JavaScript Generators support.