JavaScript-generatorer

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 yieldnø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 generatoroprettes et navngivet generatorobjekt .
  • Når generator.next()der kaldes, yieldudføres koden op til den første . Når yieldder 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 yieldudtryk returnerer en værdi. I modsætning til returnudsagnet 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).
Arbejde med generatorfunktion i JavaScript

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 af yield(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 andet yield.
     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… ofloop. 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 returnudsagnet i en generatorfunktion. Den returnsæ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 returnudsagnet er stødt, returnerer det værdien og doneegenskaben bliver true, og funktionen afsluttes. Derfor returnerer next()metoden efter returnerklæringen ikke noget.

Bemærk : Du kan også bruge return()metoden i stedet for returnudsagnet 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.

Interessante artikler...