Šajā apmācībā jūs uzzināsit par JavaScript ģeneratoriem, izmantojot piemērus.
JavaScript ģeneratori nodrošina jaunu veidu, kā strādāt ar funkcijām un iteratoriem.
Izmantojot ģeneratoru,
- Jūs varat apturēt funkcijas izpildi no jebkuras vietas funkcijas iekšpusē
- un turpiniet izpildīt kodu no apturētas pozīcijas
Izveidojiet JavaScript ģeneratorus
Lai izveidotu ģeneratoru, vispirms jādefinē ģeneratora funkcija ar function*
simbolu. Ģeneratora funkciju objektus sauc par ģeneratoriem.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Piezīme . Ģeneratora funkciju apzīmē ar *
. Varat tos izmantot function* generatorFunc() (… )
vai function *generatorFunc()(… )
izveidot.
Ražas izmantošana, lai apturētu izpildi
Kā minēts iepriekš, jūs varat apturēt ģeneratora funkcijas izpildi, neizpildot visu funkcijas ķermeni. Tam mēs izmantojam yield
atslēgvārdu. Piemēram,
// 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());
Rezultāts
1. kods pirms pirmās ienesīguma (vērtība: 100, izdarīts: nepatiesa)
Šeit,
- Tiek izveidots ģeneratora objekts ar nosaukumu
generator
. - Kad
generator.next()
tiek izsaukts,yield
tiek izpildīts kods līdz pirmajam . Kadyield
rodas, programma atgriež vērtību un pārtrauc ģeneratora funkciju.
Piezīme . Pirms mainīgā izmantošanas jums jāpiešķir ģeneratora objekti.
Darbs ar vairākiem ienesīguma paziņojumiem
yield
Izteiksme atgriež vērtību. Tomēr, atšķirībā no return
paziņojuma, tas nepārtrauc programmas darbību. Tāpēc jūs varat turpināt izpildīt kodu no pēdējās iegūtās pozīcijas. Piemēram,
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());
Rezultāts
1. kods pirms pirmās ienesīguma (vērtība: 100, izdarīts: nepatiesa) 2. kods pirms otrās ienesīguma (vērtība: 200, izdarīts: nepatiesa) (vērtība: nenoteikts, izdarīts: patiess)
Šī programma darbojas šādi.
- Pirmais
generator.next()
paziņojums izpilda kodu līdz pirmajam ienesīguma paziņojumam un pārtrauc programmas izpildi. - Otrais
generator.next()
sāk programmu no apturētās pozīcijas. - Kad ir piekļuvis visiem elementiem, tas atgriežas (vērtība: nedefinēts, darīts: patiess).

Argumentu nodošana ģeneratora funkcijām
Argumentus var nodot arī ģeneratora funkcijai. Piemēram,
// 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());
Rezultāts
(vērtība: "sveiki", izdarīts: nepatiesa) 6 kāds kods (vērtība: 5, izdarīts: nepatiess) (vērtība: nedefinēts, izdarīts: patiess)
Iepriekš minētajā programmā
- Pirmais
generator.next()
atgriež vērtībuyield
(šajā gadījumā "sveiki"). Tomēr vērtība nav piešķirta mainīgajam xlet x = yield 'hello';
(vērtība: "sveiki", darīts: nepatiesa)
- Kad
generator.next(6)
rodas, kods atkal sākas arlet x = yield 'hello';
un arguments 6 tiek piešķirts x. Arī atlikušais kods tiek izpildīts līdz otrajamyield
.6 daži kodi (vērtība: 5, izdarīts: nepatiesa)
- Kad trešais
next()
ir izpildīts, programma atgriežas (vērtība: nedefinēts, darīts: patiess). Tas ir tāpēc, ka nav citu ienesīguma pārskatu.(vērtība: nedefinēts, izdarīts: patiess)
Ģeneratori tiek izmantoti Iterable ieviešanai
Ģeneratori nodrošina vienkāršāku iteratoru ieviešanas veidu.
Ja vēlaties iteratoru ieviest manuāli, jums ir jāizveido iterators ar next()
metodi un jāsaglabā stāvoklis. Piemēram,
// 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); )
Rezultāts
1 2 3
Tā kā ģeneratori ir atkārtojami, iteratoru var ieviest vienkāršākā veidā. Tad jūs varat atkārtot, izmantojot ģeneratorus, izmantojot for… of
cilpu. Piemēram,
// generator function function* generatorFunc() ( yield 1; yield 2; yield 3; ) const obj = generatorFunc(); // iteration through generator for (let value of obj) ( console.log(value); )
Ģeneratoru metodes
Metode | Apraksts |
---|---|
next() | Atgriež ienesīguma vērtību |
return() | Atgriež vērtību un pārtrauc ģeneratoru |
throw() | Izmet kļūdu un pārtrauc ģeneratoru |
JavaScript atgriež Vs ienesīguma atslēgvārdu
atgriezt atslēgvārdu | ražas atslēgvārds |
---|---|
Atgriež vērtību un pārtrauc funkciju. | Atgriež vērtību un pārtrauc funkciju, bet funkcija netiek pārtraukta. |
Pieejams gan parastajās, gan ģeneratora funkcijās. | Pieejams tikai ģeneratora funkcijās. |
JavaScript ģeneratora funkcija ar atgriešanos
return
Izrakstu var izmantot ģeneratora funkcijā. return
Paziņojums atgriež vērtību un izbeidz funkciju (līdzīgi regulāru funkcijām). Piemēram,
// 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());
Rezultāts
(vērtība: 100, izdarīts: nepatiesa) (vērtība: 123, izdarīts: patiess) (vērtība: nedefinēts, izdarīts: patiess)
Iepriekš minētajā programmā, kad return
tiek sastapts paziņojums, tas atgriež vērtību un done
rekvizītu true
, un funkcija beidzas. Tādējādi next()
metode pēc return
paziņojuma neko neatgriež.
Piezīme . Jūs varat arī izmantot return()
metodi return
priekšraksta vietā, piemēram generator.return(123);
, iepriekš minētajā kodā.
JavaScript ģeneratora metiena metode
Izmantojot metiena () metodi, jūs varat nepārprotami mest kļūdu ģeneratora funkcijā. Metodes izmantošana throw()
rada kļūdu un pārtrauc funkciju. Piemēram,
// 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());
Rezultāts
(vērtība: 1, izdarīts: nepatiesa) Kļūda: Radās kļūda.
Ģeneratoru izmantošana
- Ģeneratori ļauj mums rakstīt tīrāku kodu, rakstot asinhronus uzdevumus.
- Ģeneratori nodrošina vienkāršāku iteratoru ieviešanas veidu.
- Ģeneratori izpilda tā kodu tikai pēc nepieciešamības.
- Ģeneratori ir efektīvi atmiņā.
Ģeneratori tika ieviesti ES6 . Dažas pārlūkprogrammas var neatbalstīt ģeneratoru izmantošanu. Lai uzzinātu vairāk, apmeklējiet JavaScript ģeneratoru atbalstu.