Node.js Generators & Vertaa takaisinsoittoihin

Tรคssรค opetusohjelmassa aiomme oppia Generators ja niiden erot takaisinsoittojen kanssa

Mitรค generaattorit ovat?

Generatoron tullut melko kuuluisaksi vuonna Node.js viime aikoina ja se johtuu todennรคkรถisesti siitรค, mitรค he pystyvรคt tekemรครคn.

  • Generators ovat toimintojen suorituksia, jotka voidaan keskeyttรครค ja jatkaa myรถhemmin.
  • Generators ovat hyรถdyllisiรค suoritettaessa kรคsitteitรค, kuten "laiska suoritus". Tรคmรค tarkoittaa pohjimmiltaan sitรค, ettรค keskeyttรคmรคllรค suorituksen ja jatkamalla haluamme, voimme vetรครค arvoja vain tarvittaessa.

Generators on alla 2 avainmenetelmรครค.

  1. Tuottomenetelmรค โ€“ Tuottomenetelmรครค kutsutaan funktiossa pysรคyttรคmรครคn funktion suorittaminen tietyllรค rivillรค, jolla tuottomenetelmรครค kutsutaan.
  2. Seuraava menetelmรค โ€“ Tรคtรค menetelmรครค kutsutaan pรครคsovelluksesta, jotta voidaan jatkaa sellaisen toiminnon suorittamista, jolla on tuottomenetelmรค. Toiminnon suoritus jatkuu seuraavaan tuottomenetelmรครคn tai menetelmรคn loppuun asti.

Katsotaanpa esimerkkiรค siitรค, kuinka generaattoreita voidaan kรคyttรครค.

Esimerkissรคmme tulee olemaan yksinkertainen Add-toiminto, joka lisรครค 2 numeroa, mutta jatkamme menetelmรคn suorittamisen pysรคyttรคmistรค eri kohdissa nรคyttรครคksemme kuinka generaattoreita voidaan kรคyttรครค.

Node.js Generators

function* Add(x) {
   yield x + 1;
   var y = yield(null);
   y = 6
   return x + y;
}

var gen = Add(5);

gen.next();

gen.next(); 

Code Selitys

  1. Ensimmรคinen askel on mรครคritellรค generaattorimme "toiminto". Huomaa, ettรค tรคmรค tehdรครคn lisรครคmรคllรค "*" funktion avainsanaan. Sitten mรครคrittelemme funktion nimeltรค Add, joka ottaa parametrin x.
  2. Tuottoavainsana on generaattorikohtainen. Tรคmรค tekee siitรค tehokkaan rakenteen funktion keskeyttรคmiseen kaiken keskellรค. Joten tรคssรค funktion suoritus keskeytetรครคn, kunnes kutsumme next()-funktion, joka tehdรครคn vaiheessa 4. Tรคssรค vaiheessa x:n arvoksi tulee 6 ja funktion suoritus lopetetaan.
  3. Tรคssรค kutsumme ensin generaattorifunktiota ja lรคhetรคmme arvon 5 Add-funktiollemme. Tรคmรค arvo korvataan Lisรครค-funktiomme x-parametrissa.
  4. Kun kutsumme next()-funktiota, Add()-funktio jatkaa suoritusta. Kun seuraava kรคsky var y= tuotto(null) suoritetaan, Add()-funktio lopettaa jรคlleen suorittamisen.
  5. Nyt kun next()-funktiota on kutsuttu uudelleen, seuraavat lauseet suoritetaan, ja yhdistetty arvo x=5 ja y=6 lisรคtรครคn ja palautetaan.

Takaisinsoitto vs. generaattorit

GeneratorNiitรค kรคytetรครคn ratkaisemaan niin kutsutun takaisinsoittohelvetin ongelma. Joskus takaisinsoittofunktiot tulevat niin sisรคkkรคisiksi Node.js-sovelluksen kehittรคmisen aikana, ettรค takaisinsoittotoimintojen kรคyttรคminen on liian monimutkaista.

Tรคssรค generaattorit ovat hyรถdyllisiรค. Yksi yleisimmistรค esimerkeistรค tรคstรค on ajastintoimintojen luominen.

Katsotaanpa alla olevaa esimerkkiรค siitรค, kuinka generaattorit voivat osoittautua hyรถdyllisiksi takaisinkutsuissa.

Esimerkkimme luo vain yksinkertaisen viivefunktion. Haluamme sitten kutsua tรคtรค funktiota, joka sisรคltรครค 1000, 2000 ja 3000 ms viiveen.

Vaihe 1) Mรครคritรค takaisinsoittotoimintomme tarvittavalla viivekoodilla.

Takaisinsoitto vs. Generators

function Timedelay(ptime, callback) {

setTimeout(function() {
  
    callback("Pausing for " + ptime);
    
  }, time);
}

Code Selitys

  1. Tรครคllรค luomme funktion nimeltรค Timedelay parametrilla nimeltรค ptime. Tรคmรค vie tarvittavan viiveen, jonka haluamme ottaa kรคyttรถรถn sovelluksessamme.
  2. Seuraava askel on vain luoda viesti, joka nรคytetรครคn kรคyttรคjรคlle ja jossa sanotaan, ettรค sovellus keskeytyy nรคiden useiden millisekuntien ajan.

Vaihe 2) Katsotaan nyt koodia, jos sisรคllytimme takaisinsoittoja. Oletetaan, ettรค halusimme sisรคllyttรครค takaisinsoittoja arvoihin 1000, 2000 ja 3000 millisekuntia perustuen, alla oleva koodi nรคyttรครค, kuinka meidรคn tulisi toteuttaa ne takaisinkutsujen avulla.

Takaisinsoitto vs. Generators

Timedelay(1000, function(message) {
  
  console.log(msg);
  Timedelay(2000, function(message) {
    
    console.log(msg);
    Timedelay(3000, function(message) {
      
      console.log(msg);
  })
  })
})

Code Selitys

  1. Kutsumme aikaviivettรค takaisinsoittona, jonka arvo on 1000.
  2. Seuraavaksi haluamme kutsua uudelleen Timedelay-funktiota arvona 2000.
  3. Lopuksi haluamme kutsua Timedelay-funktiota uudelleen arvona 3000.

Yllรค olevasta koodista voit nรคhdรค, ettรค se muuttuu sotkuisemmaksi, koska haluamme alkaa kutsua toimintoa useita kertoja.

Vaihe 3) Katsotaan nyt kuinka toteuttaa sama koodi generaattoreiden avulla. Alla olevasta koodista nรคet, kuinka helppoa Timedelay-toiminnon toteuttaminen generaattoreiden avulla on tullut.

Takaisinsoitto vs. Generators

function* Messages() {
  console,log(yield(Timedelay(1000, function(){})));
  console,log(yield(Timedelay(2000, function(){})));
  console,log(yield(Timedelay(3000, function(){})));
}

Code Selitys

  1. Mรครคrittelemme ensin generaattorifunktiota, jota kรคytetรครคn kutsumaan Timedelay-funktiota.
  2. Kutsumme Yield-funktiota yhdessรค Timedelay-funktion kanssa, jonka parametriarvo on 1000.
  3. Kutsumme sitten tuottofunktiota yhdessรค Timedelay-funktion kanssa, jonka parametriarvo on 2000.
  4. Lopuksi kutsumme Yield-funktiota yhdessรค Timedelay-funktion kanssa, jonka parametriarvo on 3000.

Yhteenveto

GeneratorSillรค voidaan myรถs lievittรครค sisรคkkรคisten takaisinsoittojen ongelmia ja auttaa poistamaan niin kutsutun takaisinsoittohelvetin. Generators kรคytetรครคn pysรคyttรคmรครคn funktion kรคsittely. Tรคmรค saavutetaan kรคyttรคmรคllรค "tuotto"-menetelmรครค asynkronisessa funktiossa.

Tiivistรค tรคmรค viesti seuraavasti: