Šajā apmācībā mēs uzzināsim par ģeneratoriem un to atšķirībām ar atzvaniem
Kas ir ģeneratori?
Pēdējā laikā ģeneratori ir kļuvuši diezgan slaveni Node.js, un tas, iespējams, ir saistīts ar to, ko viņi spēj darīt.
- Ģeneratori ir funkciju izpildes, kuras var apturēt un atsākt vēlāk.
- Ģeneratori ir noderīgi, veicot tādus jēdzienus kā “slinks izpildījums”. Tas būtībā nozīmē, ka, apturot izpildi un atsākot pēc vēlēšanās, mēs spējam izvilkt vērtības tikai tad, kad tas ir nepieciešams.
Ģeneratoriem ir šādas 2 galvenās metodes
- Ienesīguma metode - ienesīguma metode tiek izsaukta funkcijā, lai apturētu funkcijas izpildi konkrētajā rindā, kur tiek dēvēta ienesīguma metode.
- Nākamā metode - šī metode tiek izsaukta no galvenās lietojumprogrammas, lai atsāktu tādas funkcijas izpildi, kurai ir ienesīguma metode. Funkcijas izpilde turpināsies līdz nākamajai ienesīguma metodei vai līdz metodes beigām.
Apskatīsim piemēru, kā var izmantot ģeneratorus.
Mūsu piemērā mums būs vienkārša funkcija Add, kas pievienos 2 skaitļus, taču mēs turpināsim apturēt metodes izpildi dažādos punktos, lai parādītu, kā ģeneratorus var izmantot.
function* Add(x) {yield x + 1;var y = yield(null);y = 6return x + y;}var gen = Add(5);gen.next();gen.next();
Koda skaidrojums: -
- Pirmais solis ir noteikt mūsu ģeneratora "funkciju". Ņemiet vērā, ka tas tiek darīts, funkcijas atslēgvārdam pievienojot "*". Pēc tam mēs definējam funkciju ar nosaukumu Add, kas ņem parametru x.
- Ienesīguma atslēgvārds ir raksturīgs ģeneratoriem. Tas padara to par spēcīgu konstrukciju, lai apturētu funkciju visa vidū. Tātad šeit funkcijas izpilde tiks apturēta, līdz mēs izsauksim nākamo () funkciju, kas tiks veikta 4. solī. Šajā brīdī x vērtība kļūs par 6, un funkcijas izpilde tiks pārtraukta.
- Šeit mēs vispirms izsaucam ģeneratora funkciju un nosūta vērtību 5 mūsu funkcijai Pievienot. Šī vērtība tiks aizstāta ar mūsu Add funkcijas x parametru.
- Kad mēs izsauksim nākamo () funkciju, funkcija Add () atsāks izpildi. Kad tiks izpildīts nākamais priekšraksts var y = ienesīgums (null), funkcija Add () atkal tiks pārtraukta.
- Tagad pēc nākamās () funkcijas atkārtotas izsaukšanas darbosies nākamie priekšraksti, un tiks pievienota un atgriezta kombinētā vērtība x = 5 un y = 6.
Atzvani pret ģeneratoriem
Ģeneratori tiek izmantoti, lai atrisinātu problēmu, ko sauc par atzvanīšanas elli. Dažreiz Node.js lietojumprogrammas izstrādes laikā atzvana funkcijas kļūst tik ligzdotas, ka atzvanīšanas funkciju izmantošana kļūst pārāk sarežģīta.
Šeit ir noderīgi ģeneratori. Viens no visizplatītākajiem piemēriem tam ir, veidojot taimera funkcijas.
Apskatīsim zemāk redzamo piemēru, kā ģeneratori var izrādīties noderīgi, izmantojot atzvanīšanu.
Mūsu piemērs vienkārši izveidos vienkāršu laika aizkaves funkciju. Tad mēs vēlētos saukt šo funkciju, iekļaujot 1000, 2000 un 3000 ms kavēšanos.
1. solis. Definējiet mūsu atzvanīšanas funkciju ar nepieciešamo laika aizkaves kodu.
function Timedelay(ptime, callback) {setTimeout(function() {callback("Pausing for " + ptime);}, time);}
Koda skaidrojums: -
- Šeit mēs izveidojam funkciju ar nosaukumu Timedelay ar parametru ar nosaukumu ptime. Tas prasīs nepieciešamo laika kavējumu, kuru mēs vēlamies ieviest mūsu pieteikumā.
- Nākamais solis ir vienkārši izveidot ziņojumu, kas tiks parādīts lietotājam, sakot, ka lietojumprogramma pārtrauks šo daudzo milisekunžu skaitu.
2. solis. Tagad aplūkosim kodu, ja mēs iekļausim atzvanīšanu. Pieņemsim, ka mēs vēlējāmies iekļaut atzvanīšanu, pamatojoties uz vērtību 1000, 2000 un 3000 milisekundes, zemāk redzamais kods parāda, kā mums tie būtu jāievieš, izmantojot atzvanīšanu.
Timedelay(1000, function(message) {console.log(msg);Timedelay(2000, function(message) {console.log(msg);Timedelay(3000, function(message) {console.log(msg);})})})
Koda skaidrojums: -
- Mēs saucam Timedelay kā atzvanīšanu ar vērtību 1000.
- Tālāk mēs vēlreiz vēlamies izsaukt funkciju Timedelay ar vērtību 2000.
- Visbeidzot, mēs vēlamies vēlreiz izsaukt funkciju Timedelay ar vērtību 3000.
No iepriekš minētā koda jūs varat redzēt, ka tas kļūst īsāks, jo mēs vēlamies sākt vairākas reizes izsaukt funkciju.
3. solis. Tagad redzēsim, kā ieviest to pašu kodu, izmantojot ģeneratorus. No zemāk redzamā koda jūs tagad varat redzēt, cik vienkārši ir bijis ieviest funkciju Timedelay, izmantojot ģeneratorus.
function* Messages() {console,log(yield(Timedelay(1000, function(){})));console,log(yield(Timedelay(2000, function(){})));console,log(yield(Timedelay(3000, function(){})));}
Koda skaidrojums: -
- Vispirms mēs definējam ģeneratora funkciju, kuru izmantos, lai izsauktu mūsu funkciju Timedelay.
- Mēs izsaucam funkciju Yield kopā ar funkciju Timedelay ar 1000 kā parametra vērtību.
- Pēc tam mēs izsaucam funkciju Yield kopā ar funkciju Timedelay ar parametra vērtību 2000.
- Visbeidzot, mēs izsaucam funkciju Yield kopā ar funkciju Timedelay ar 3000 kā parametra vērtību.
Kopsavilkums
Ģeneratorus var izmantot arī, lai atvieglotu problēmas ar ligzdotajiem atzvaniem un palīdzētu novērst tā saucamo atzvanīšanas elli. Ģeneratori tiek izmantoti, lai apturētu funkcijas apstrādi. Tas tiek panākts, asinhronajā funkcijā izmantojot “ražas” metodi.