JavaScript ģeneratori

Š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 yieldatslē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, yieldtiek izpildīts kods līdz pirmajam . Kad yieldrodas, 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

yieldIzteiksme atgriež vērtību. Tomēr, atšķirībā no returnpaziņ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).
Ģeneratora funkcijas darbība JavaScript

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ību yield(š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 ar let x = yield 'hello';un arguments 6 tiek piešķirts x. Arī atlikušais kods tiek izpildīts līdz otrajam yield.
     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… ofcilpu. 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

returnIzrakstu var izmantot ģeneratora funkcijā. returnPaziņ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 returntiek sastapts paziņojums, tas atgriež vērtību un donerekvizītu true, un funkcija beidzas. Tādējādi next()metode pēc returnpaziņojuma neko neatgriež.

Piezīme . Jūs varat arī izmantot return()metodi returnpriekš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.

Interesanti raksti...