În acest tutorial, veți afla despre generatoarele JavaScript cu ajutorul exemplelor.
În JavaScript, generatoarele oferă un nou mod de a lucra cu funcții și iteratoare.
Folosind un generator,
- puteți opri executarea unei funcții de oriunde din interiorul funcției
- și continuați să executați codul dintr-o poziție oprită
Creați generatoare JavaScript
Pentru a crea un generator, trebuie să definiți mai întâi o funcție generator cu function*
simbol. Obiectele funcțiilor generatorului se numesc generatoare.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Notă : Funcția generator este notată cu *
. Puteți să le utilizați function* generatorFunc() (… )
sau function *generatorFunc()(… )
să le creați.
Utilizarea randamentului pentru întreruperea executării
După cum sa menționat mai sus, puteți întrerupe executarea unei funcții generator fără a executa întregul corp al funcției. Pentru aceasta, folosim yield
cuvântul cheie. De exemplu,
// 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());
Ieșire
1. cod înainte de primul randament (valoare: 100, făcut: fals)
Aici,
- Se
generator
creează un obiect generator numit . - Când
generator.next()
este apelat, codul până la primulyield
este executat. Cândyield
este întâlnit, programul returnează valoarea și întrerupe funcția generator.
Notă : Trebuie să atribuiți obiecte generator unei variabile înainte de a o utiliza.
Funcționarea declarațiilor de randament multiple
yield
Expresia returnează o valoare. Cu toate acestea, spre deosebire de return
declarație, nu pune capăt programului. De aceea, puteți continua să executați cod din ultima poziție cedată. De exemplu,
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());
Ieșire
1. cod înainte de primul randament (valoare: 100, făcut: fals) 2. cod înainte de al doilea randament (valoare: 200, făcut: fals) (valoare: nedefinit, făcut: adevărat)
Iată cum funcționează acest program.
- Prima
generator.next()
instrucțiune execută codul până la prima instrucțiune de randament și întrerupe executarea programului. - Al doilea
generator.next()
pornește programul din poziția întreruptă. - Când toate elementele sunt accesate, acesta revine (valoare: nedefinit, făcut: adevărat).

Transmiterea argumentelor la funcțiile generatorului
De asemenea, puteți transmite argumente unei funcții generator. De exemplu,
// 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());
Ieșire
(valoare: "salut", făcut: fals) 6 un anumit cod (valoare: 5, făcut: fals) (valoare: nedefinit, făcut: adevărat)
În programul de mai sus,
- Primul
generator.next()
returnează valoareayield
(în acest caz, „salut”). Cu toate acestea, valoarea nu este atribuită variabilei x înlet x = yield 'hello';
(valoare: „salut”, făcut: fals)
- Când
generator.next(6)
este întâlnit, codul începe din nou lalet x = yield 'hello';
și argumentul 6 este atribuit lui x. De asemenea, codul rămas este executat până la al doileayield
.6 un cod (valoare: 5, făcut: fals)
- Când al treilea
next()
este executat, programul revine (valoare: nedefinit, făcut: adevărat). Acest lucru se datorează faptului că nu există alte declarații de randament.(valoare: nedefinit, făcut: adevărat)
Generatoarele sunt utilizate pentru implementarea Iterables
Generatoarele oferă o modalitate mai ușoară de implementare a iteratorilor.
Dacă doriți să implementați manual un iterator, trebuie să creați un iterator cu next()
metoda și să salvați starea. De exemplu,
// 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); )
Ieșire
1 2 3
Deoarece generatoarele sunt iterabile, puteți implementa un iterator într-un mod mai ușor. Apoi, puteți itera prin generatoare folosind for… of
bucla. De exemplu,
// generator function function* generatorFunc() ( yield 1; yield 2; yield 3; ) const obj = generatorFunc(); // iteration through generator for (let value of obj) ( console.log(value); )
Metode Generator
Metodă | Descriere |
---|---|
next() | Returnează o valoare a randamentului |
return() | Returnează o valoare și termină generatorul |
throw() | Aruncă o eroare și oprește generatorul |
JavaScript returnează Vs produce cuvânt cheie
returnează cuvânt cheie | randament Cuvânt cheie |
---|---|
Returnează valoarea și termină funcția. | Returnează valoarea și oprește funcția, dar nu oprește funcția. |
Disponibil atât în funcțiile normale, cât și în funcțiile generatorului. | Disponibil numai în funcțiile generatorului. |
Funcția Generator JavaScript Cu returnare
Puteți utiliza return
instrucțiunea într-o funcție generator. Instrucțiunea return
returnează o valoare și termină funcția (similar cu funcțiile obișnuite). De exemplu,
// 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());
Ieșire
(valoare: 100, făcut: fals) (valoare: 123, făcut: adevărat) (valoare: nedefinit, făcut: adevărat)
În programul de mai sus, când return
se întâlnește instrucțiunea, aceasta returnează valoarea și done
proprietatea devine true
și funcția se termină. Prin urmare, next()
metoda după return
declarație nu returnează nimic.
Notă : De asemenea, puteți utiliza return()
metoda în locul return
declarației ca generator.return(123);
în codul de mai sus.
JavaScript Generator Metoda de aruncare
Puteți arunca în mod explicit o eroare pe funcția generator folosind metoda throw (). Utilizarea throw()
metodei generează o eroare și încetează funcția. De exemplu,
// 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());
Ieșire
(valoare: 1, făcut: fals) Eroare: A apărut o eroare.
Utilizări ale generatoarelor
- Generatoarele ne permit să scriem un cod mai curat în timp ce scriem sarcini asincrone.
- Generatoarele oferă o modalitate mai ușoară de implementare a iteratorilor.
- Generatoarele își execută codul numai atunci când este necesar.
- Generatoarele sunt eficiente în memorie.
Generatoarele au fost introduse în ES6 . Este posibil ca unele browsere să nu accepte utilizarea generatoarelor. Pentru a afla mai multe, accesați asistența JavaScript Generators.