Selles õpetuses tutvume generaatoritega ja nende erinevustega tagasihelistamistega
Mis on generaatorid?
Generaatorid on Node.js-is viimasel ajal üsna kuulsaks saanud ja seda ilmselt tänu sellele, mida nad suudavad teha.
- Generaatorid on funktsioonide teostused, mille saab hiljem peatada ja jätkata.
- Generaatorid on kasulikud selliste mõistete teostamisel nagu "laisk hukkamine". Põhimõtteliselt tähendab see, et peatades täitmise ja jätkates oma äranägemise järgi, suudame väärtusi tõmmata ainult siis, kui seda vaja on.
Generaatoritel on kaks põhimeetodit allpool
- Saagise meetod - saagismeetodit kutsutakse funktsioonis, et peatada funktsiooni täitmine konkreetsel real, kus tootlusmeetodit kutsutakse.
- Järgmine meetod - seda meetodit kutsutakse põhirakendusest, et jätkata tootluse meetodiga funktsiooni täitmist. Funktsiooni täitmist jätkatakse kuni järgmise tootlusmeetodini või kuni meetodi lõpuni.
Vaatame näidet generaatorite kasutamisest.
Meie näites on meil lihtne funktsioon Add, mis lisab 2 numbrit, kuid me peatame meetodi täitmise erinevates punktides, et näidata, kuidas generaatoreid saab kasutada.
function* Add(x) {yield x + 1;var y = yield(null);y = 6return x + y;}var gen = Add(5);gen.next();gen.next();
Koodi selgitus: -
- Esimene samm on meie generaatori "funktsiooni" määratlemine. Pange tähele, et seda tehakse funktsiooni märksõnale "*" lisamisega. Seejärel määratleme funktsiooni Add, mis võtab parameetri x.
- Tootlikkuse märksõna on spetsiifiline generaatoritele. See teeb sellest võimsa konstruktsiooni funktsiooni peatamiseks kõige keskel. Nii et siin peatatakse funktsiooni täitmine, kuni kutsume üles järgmise () funktsiooni, mis tehakse 4. etapis. Sel hetkel saab x väärtuseks 6 ja funktsiooni täitmine peatatakse.
- Siin kutsume kõigepealt generaatori funktsiooni ja saadame väärtuse 5 meie funktsioonile Add. See väärtus asendatakse meie funktsiooni Add parameetriga x.
- Kui kutsume järgmise funktsiooni (), jätkab funktsioon Add () käivitamist. Kui järgmine lause var y = tootlus (null) käivitatakse, lõpetab funktsioon Add () uuesti täitmise.
- Nüüd, kui olete uuesti kutsunud järgmise funktsiooni (), käivitatakse järgmised väited ning liitväärtus x = 5 ja y = 6 lisatakse ja tagastatakse.
Tagasihelistamised vs generaatorid
Generaatorit kasutatakse nn tagasihelistamise probleemi lahendamiseks. Mõnikord muutuvad tagasihelistamisfunktsioonid rakenduse Node.js väljatöötamise ajal nii pesastatud, et tagasihelistusfunktsioonide kasutamine muutub lihtsalt liiga keeruliseks.
Siin on generaatorid kasulikud. Selle üks levinumaid näiteid on taimeri funktsioonide loomine.
Vaatame allpool toodud näidet selle kohta, kuidas generaatorid võivad tagasihelistamise korral kasulikuks osutuda.
Meie näide loob lihtsalt lihtsa viivituse funktsiooni. Seejärel tahaksime seda funktsiooni nimetada viivitusega 1000, 2000 ja 3000 ms.
1. samm. Määrake meie tagasihelistamisfunktsioon vajaliku viivituskoodiga.
function Timedelay(ptime, callback) {setTimeout(function() {callback("Pausing for " + ptime);}, time);}
Koodi selgitus: -
- Siin loome funktsiooni nimega Timedelay parameetriga nimega ptime. Selleks kulub vajalik aeg, mida soovime oma rakenduses tutvustada.
- Järgmine samm on lihtsalt sõnumi loomine, mida kuvatakse kasutajale, öeldes, et rakendus peatub nende paljude millisekundite arvu jaoks.
Samm 2) Nüüd vaatame koodi, kui lisasime tagasihelistamisi. Oletame, et tahtsime lisada tagasihelistamisväärtused 1000, 2000 ja 3000 millisekundite väärtuse põhjal, allpool toodud kood näitab, kuidas meil oleks vaja neid tagasihelistuste abil rakendada.
Timedelay(1000, function(message) {console.log(msg);Timedelay(2000, function(message) {console.log(msg);Timedelay(3000, function(message) {console.log(msg);})})})
Koodi selgitus: -
- Kutsume ajakava tagasihelistamiseks, mille väärtus on 1000.
- Järgmisena tahame uuesti helistada funktsioonile Timedelay, väärtuseks 2000.
- Lõpuks tahame uuesti helistada funktsioonile Timedelay väärtusega 3000.
Ülaltoodud koodist näete, et see muutub segasemaks, kuna me tahame hakata funktsiooni mitu korda kutsuma.
Samm 3) Nüüd vaatame, kuidas sama koodi generaatorite abil rakendada. Allolevast koodist näete nüüd, kui lihtsaks on saanud funktsiooni Timedelay rakendamine generaatorite abil.
function* Messages() {console,log(yield(Timedelay(1000, function(){})));console,log(yield(Timedelay(2000, function(){})));console,log(yield(Timedelay(3000, function(){})));}
Koodi selgitus: -
- Esmalt määratleme generaatori funktsiooni, mida kasutatakse meie ajafunktsiooni kutsumiseks.
- Kutsume funktsiooni Saagikus koos funktsiooniga Timedelay koos parameetri väärtusega 1000.
- Seejärel kutsume funktsiooni Saagikus koos funktsiooniga Timedelay koos parameetri väärtusega 2000.
- Lõpuks kutsume funktsiooni Saagikus koos funktsiooniga Timedelay koos parameetri väärtusega 3000.
Kokkuvõte
Generaatoreid saab kasutada ka sisestatud tagasihelistamise probleemide leevendamiseks ja nn tagasihelistamise põrgu eemaldamiseks. Generaatorit kasutatakse funktsiooni töötluse peatamiseks. Selle saavutamiseks kasutatakse asünkroonses funktsioonis meetodit 'saagikus'.