I denne vejledning lærer du om JavaScript-generatorer ved hjælp af eksempler.
I JavaScript giver generatorer en ny måde at arbejde med funktioner og iteratorer på.
Ved hjælp af en generator,
- du kan stoppe udførelsen af en funktion hvor som helst inde i funktionen
- og fortsæt med at udføre kode fra en standset position
Opret JavaScript-generatorer
For at oprette en generator skal du først definere en generatorfunktion med function*
symbol. Genstande til generatorfunktioner kaldes generatorer.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Bemærk : Generatorfunktionen betegnes med *
. Du kan enten bruge function* generatorFunc() (… )
eller function *generatorFunc()(… )
oprette dem.
Brug af udbytte til pause i udførelse
Som nævnt ovenfor kan du stoppe udførelsen af en generatorfunktion uden at udføre hele funktionsorganet. Til det bruger vi yield
nøgleordet. 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());
Produktion
1. kode før det første udbytte (værdi: 100, udført: falsk)
Her,
- Der
generator
oprettes et navngivet generatorobjekt . - Når
generator.next()
der kaldes,yield
udføres koden op til den første . Nåryield
der opstår, returnerer programmet værdien og sætter generatorfunktionen på pause.
Bemærk : Du skal tildele generatorobjekter til en variabel, før du bruger den.
Arbejde med flere udbytteopgørelser
Den yield
udtryk returnerer en værdi. I modsætning til return
udsagnet afslutter det imidlertid ikke programmet. Derfor kan du fortsætte med at udføre kode fra den sidst opnåede position. 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());
Produktion
1. kode før første udbytte (værdi: 100, udført: falsk) 2. kode før andet udbytte (værdi: 200, udført: falsk) (værdi: udefineret, udført: sand)
Sådan fungerer dette program.
- Den første
generator.next()
sætning udfører koden op til den første udbytteerklæring og sætter programmets gennemførelse på pause. - Det andet
generator.next()
starter programmet fra den holdte pause. - Når der er adgang til alle elementerne, vender den tilbage (værdi: udefineret, færdig: sand).

Videregivelse af argumenter til generatorfunktioner
Du kan også videregive argumenter til en generatorfunktion. 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());
Produktion
(værdi: "hej", færdig: falsk) 6 nogle kode (værdi: 5, udført: falsk) (værdi: udefineret, udført: sand)
I ovenstående program,
- Den første
generator.next()
returnerer værdien afyield
(i dette tilfælde 'hej'). Værdien tildeles dog ikke variablen x ilet x = yield 'hello';
(værdi: "hej", færdig: falsk)
- Når der
generator.next(6)
er stødt på, starter koden igen kl,let x = yield 'hello';
og argumentet 6 tildeles x. Også den resterende kode udføres indtil det andetyield
.6 noget kode (værdi: 5, færdig: falsk)
- Når den tredje
next()
udføres, vender programmet tilbage (værdi: udefineret, færdig: sand). Det er fordi der ikke er andre renteopgørelser.(værdi: udefineret, færdig: sand)
Generatorer bruges til implementering af itterables
Generatorer giver en lettere måde at implementere iteratorer på.
Hvis du vil implementere en iterator manuelt, skal du oprette en iterator med next()
metoden og gemme 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); )
Produktion
1 2 3
Da generatorer er iterables, kan du implementere en iterator på en lettere måde. Derefter kan du gentage gennem generatorerne ved hjælp af for… of
loop. 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 værdi af udbyttet |
return() | Returnerer en værdi og afslutter generatoren |
throw() | Kaster en fejl og afslutter generatoren |
JavaScript returnerer Vs giver nøgleord
returner nøgleord | give nøgleord |
---|---|
Returnerer værdien og afslutter funktionen. | Returnerer værdien og stopper funktionen, men afslutter ikke funktionen. |
Fås i både normale funktioner og generatorfunktioner. | Fås kun i generatorfunktioner. |
JavaScript-generatorfunktion med retur
Du kan bruge return
udsagnet i en generatorfunktion. Den return
sætning returnerer en værdi, og afslutter funktionen (svarende til almindelige funktioner). 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());
Produktion
(værdi: 100, udført: falsk) (værdi: 123, udført: sand) (værdi: udefineret, udført: sand)
I ovenstående program, når return
udsagnet er stødt, returnerer det værdien og done
egenskaben bliver true
, og funktionen afsluttes. Derfor returnerer next()
metoden efter return
erklæringen ikke noget.
Bemærk : Du kan også bruge return()
metoden i stedet for return
udsagnet som generator.return(123);
i ovenstående kode.
JavaScript-generatorens kastemetode
Du kan eksplicit kaste en fejl på generatorfunktionen ved hjælp af throw () -metoden. Brug af throw()
metoden kaster en fejl og afslutter funktionen. 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());
Produktion
(værdi: 1, udført: falsk) Fejl: Der opstod en fejl.
Anvendelse af generatorer
- Generatorer lader os skrive renere kode, mens vi skriver asynkrone opgaver.
- Generatorer giver en lettere måde at implementere iteratorer på.
- Generatorer udfører kun sin kode, når det kræves.
- Generatorer er hukommelseseffektive.
Generatorer blev introduceret i ES6 . Nogle browsere understøtter muligvis ikke brugen af generatorer. Hvis du vil vide mere, skal du besøge JavaScript Generators support.