I den här handledningen lär du dig om JavaScript-generatorer med hjälp av exempel.
I JavaScript erbjuder generatorer ett nytt sätt att arbeta med funktioner och iteratorer.
Med hjälp av en generator,
- du kan stoppa körningen av en funktion var som helst i funktionen
- och fortsätt att köra kod från en stoppad position
Skapa JavaScript-generatorer
För att skapa en generator måste du först definiera en generatorfunktion med function*
symbol. Objekten för generatorfunktioner kallas generatorer.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Obs! Generatorfunktionen betecknas med *
. Du kan antingen använda function* generatorFunc() (… )
eller function *generatorFunc()(… )
skapa dem.
Använda avkastning för att pausa utförandet
Som nämnts ovan kan du pausa körningen av en generatorfunktion utan att utföra hela funktionskroppen. För det använder vi yield
nyckelordet. Till exempel,
// 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. kod före första avkastningen (värde: 100, gjort: falskt)
Här,
- Ett genererat objekt med namnet
generator
skapas. - När det
generator.next()
anropasyield
körs koden fram till den första . När detyield
påträffas returnerar programmet värdet och pausar generatorfunktionen.
Obs! Du måste tilldela generatorobjekt till en variabel innan du använder den.
Arbeta med flera avkastningsuttalanden
Det yield
uttrycket returnerar ett värde. Men till skillnad från return
uttalandet avslutar det inte programmet. Det är därför du kan fortsätta att köra kod från den senast givna positionen. Till exempel,
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. kod före första avkastning (värde: 100, gjort: falskt) 2. kod före andra avkastning (värde: 200, gjort: falskt) (värde: odefinierad, gjort: sann)
Så här fungerar det här programmet.
- Det första
generator.next()
uttalandet kör koden fram till det första avkastningsuttalandet och pausar körningen av programmet. - Den andra
generator.next()
startar programmet från pausläget. - När alla element är åtkomliga returnerar den (värde: odefinierad, klar: sann).

Vidarebefordra argument till generatorfunktioner
Du kan också skicka argument till en generatorfunktion. Till exempel,
// 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ärde: "hej", gjort: falsk) 6 någon kod (värde: 5, gjort: falsk) (värde: odefinierad, klar: sann)
I ovanstående program,
- Den första
generator.next()
returnerar värdet påyield
(i det här fallet 'hej'). Värdet tilldelas dock inte variabeln x inlet x = yield 'hello';
(värde: "hej", gjort: falskt)
- När man
generator.next(6)
stöter på börjar koden igen kllet x = yield 'hello';
och argumentet 6 tilldelas x. Återstående kod körs också fram till den andrayield
.6 någon kod (värde: 5, gjort: falskt)
- När det tredje
next()
körs återgår programmet (värde: odefinierat, gjort: sant). Det beror på att det inte finns några andra avkastningsuttalanden.(värde: odefinierat, gjort: sant)
Generatorer används för att implementera Iterables
Generatorer är ett enklare sätt att implementera iteratorer.
Om du vill implementera en iterator manuellt måste du skapa en iterator med next()
metoden och spara tillståndet. Till exempel,
// 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
Eftersom generatorer är iterabla kan du implementera en iterator på ett enklare sätt. Då kan du iterera genom generatorerna med for… of
slingan. Till exempel,
// 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
Metod | Beskrivning |
---|---|
next() | Returnerar ett avkastningsvärde |
return() | Returnerar ett värde och avslutar generatorn |
throw() | Kastar ett fel och avslutar generatorn |
JavaScript returnerar Vs ger nyckelord
returnera nyckelord | ge nyckelord |
---|---|
Returnerar värdet och avslutar funktionen. | Returnerar värdet och stoppar funktionen men avslutar inte funktionen. |
Finns i både de vanliga funktionerna och generatorfunktionerna. | Finns endast i generatorfunktioner. |
JavaScript-generatorfunktion med retur
Du kan använda return
uttalandet i en generatorfunktion. Det return
uttalandet returnerar ett värde och avslutar funktionen (liknande vanliga funktioner). Till exempel,
// 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ärde: 100, gjort: falskt) (värde: 123, gjort: sant) (värde: odefinierat, gjort: sant)
I ovanstående program, när return
uttalandet påträffas, returnerar det värdet och done
egenskapen blir true
, och funktionen avslutas. Därför returnerar next()
metoden efter return
uttalandet inget.
Obs! Du kan också använda return()
metoden istället för return
uttalandet som generator.return(123);
i ovanstående kod.
JavaScript Generator Throw Method
Du kan uttryckligen kasta ett fel på generatorfunktionen med hjälp av throw () -metoden. Användningen av throw()
metoden ger ett fel och avslutar funktionen. Till exempel,
// 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ärde: 1, gjort: falskt) Fel: Fel inträffade.
Användning av generatorer
- Generatorer låter oss skriva renare kod medan vi skriver asynkrona uppgifter.
- Generatorer är ett enklare sätt att implementera iteratorer.
- Generatorer kör endast sin kod när det krävs.
- Generatorer är minneseffektiva.
Generatorer introducerades i ES6 . Vissa webbläsare stöder kanske inte användningen av generatorer. För mer information, besök JavaScript Generators support.