Node.js-generaattorit & Vertaa takaisinsoittoihin

Sisällysluettelo:

Anonim

Tässä opetusohjelmassa aiomme oppia generaattoreista ja niiden eroista takaisinsoittojen kanssa

Mitä generaattorit ovat?

Generaattoreista on tullut melko tunnettuja Node.js: ssä viime aikoina ja todennäköisesti siksi, mitä he pystyvät tekemään.

  • Generaattorit ovat toimintojen suorituksia, jotka voidaan keskeyttää ja jatkaa myöhemmin.
  • Generaattorit ovat hyödyllisiä toteutettaessa sellaisia ​​käsitteitä kuin "laiska toteutus". Tämä tarkoittaa pohjimmiltaan sitä, että keskeyttämällä toteutus ja jatkamalla haluamme pystymme vetämään arvoja vain silloin, kun sitä tarvitaan.

Generaattoreilla on alla olevat kaksi keskeistä menetelmää

  1. Tuotto-menetelmä - Tuotto-menetelmää kutsutaan funktiossa pysäyttämään toiminnon suorittaminen tietyllä rivillä, jossa tuotto-menetelmää kutsutaan.
  2. Seuraava menetelmä - Tätä menetelmää kutsutaan pääsovelluksesta palauttamaan menetelmän sisältävän toiminnon suorittaminen. Funktion suorittamista jatketaan seuraavaan tuottomenetelmään tai menetelmän loppuun saakka.

Katsotaanpa esimerkkiä siitä, miten generaattoreita voidaan käyttää.

Esimerkissämme meillä on yksinkertainen Lisää-funktio, joka lisää kaksi numeroa, mutta pysäytämme menetelmän suorittamisen eri kohdissa esittelemään, miten generaattoreita voidaan käyttää.

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

Koodin selitys: -

  1. Ensimmäinen vaihe on määritellä generaattorin "toiminto". Huomaa, että tämä tehdään lisäämällä "*" funktion avainsanaan. Määritämme sitten funktion nimeltä Add, joka ottaa parametrin x.
  2. Tuottoavainsana on erityinen generaattoreille. Tämä tekee siitä tehokkaan rakenteen toiminnan keskeyttämiseksi kaiken keskellä. Joten tässä toiminnon suorittaminen keskeytetään, kunnes käytämme seuraavaa () -funktiota, joka tehdään vaiheessa 4. Tässä vaiheessa x: n arvosta tulee 6 ja toiminnon suorittaminen lopetetaan.
  3. Tässä kutsumme ensin generaattoritoiminnon ja lähetämme arvon 5 Add-funktiollemme. Tämä arvo korvataan Add-funktion x-parametrilla.
  4. Kun kutsumme seuraavan () -funktion, Add () -toiminto jatkaa suoritusta. Kun seuraava käsky var y = tuotto (null) suoritetaan, Add () -toiminto lopettaa taas suorituksen.
  5. Nyt kun seuraava () -funktio on kutsuttu uudelleen, seuraavat lauseet suoritetaan, ja x = 5 ja y = 6 yhdistetty arvo lisätään ja palautetaan.

Takaisinkutsut vs. generaattorit

Generaattoreita käytetään ongelman ratkaisemiseen, mikä tunnetaan nimellä takaisinsoittohelvetti. Joskus takaisinsoittotoiminnot ovat niin sisäkkäisiä Node.js-sovelluksen kehityksen aikana, että soittopyyntötoimintojen käyttäminen on liian monimutkaista.

Tässä generaattorit ovat hyödyllisiä. Yksi yleisimmistä esimerkeistä tästä on ajastintoimintojen luominen.

Katsotaanpa alla oleva esimerkki siitä, kuinka generaattorit voivat osoittautua hyödyllisiksi takaisinsoittojen yhteydessä.

Esimerkkimme luo yksinkertaisen aikaviivefunktion. Sitten haluaisimme kutsua tätä toimintoa sisältäen 1000, 2000 ja 3000 ms viiveen.

Vaihe 1) Määritä takaisinkutsutoimintomme tarvittavalla aikaviivakoodilla.

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

Koodin selitys: -

  1. Tässä luomme funktion nimeltä Timedelay parametrilla nimeltä ptime. Tämä vie tarvittavan viiveen, jonka haluamme sisällyttää sovellukseemme.
  2. Seuraava vaihe on vain luoda viesti, joka näytetään käyttäjälle sanomalla, että sovellus on tauko näille monille millisekunteille.

Vaihe 2) Katsotaan nyt koodia, jos sisällytimme takaisinsoittoja. Oletetaan, että halusimme sisällyttää takaisinsoittoja 1000, 2000 ja 3000 millisekunnin arvojen perusteella, alla oleva koodi osoittaa, kuinka meidän olisi toteutettava nämä takaisinsoittojen avulla.

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

Koodin selitys: -

  1. Kutsumme Timedelayä soittopyynnöksi, jonka arvo on 1000.
  2. Seuraavaksi haluamme kutsua ajastintoiminnon uudelleen arvoksi 2000.
  3. Lopuksi haluamme kutsua ajastintoiminnon uudelleen arvoksi 3000.

Yllä olevasta koodista näet, että se muuttuu viehättävämmäksi, kun haluamme alkaa kutsua toimintoa useita kertoja.

Vaihe 3) Katsotaan nyt, kuinka sama koodi otetaan käyttöön generaattoreilla. Alla olevasta koodista näet nyt, kuinka helppoa on ollut Timedelay-toiminnon toteuttaminen generaattoreiden avulla.

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

Koodin selitys: -

  1. Määrittelemme ensin generaattoritoiminnon, jota käytetään kutsumaan Timedelay-funktiollemme.
  2. Kutsumme Yield-funktiota yhdessä Timedelay-funktion kanssa parametriarvona 1000.
  3. Kutsumme sitten Tuotto-funktiota yhdessä Timedelay-funktion kanssa parametriarvona 2000.
  4. Lopuksi kutsumme Yield-funktion yhdessä Timedelay-toiminnon kanssa parametriarvona 3000.

Yhteenveto

Generaattoreita voidaan käyttää myös sisäkkäisten takaisinsoittojen ongelmien lievittämiseen ja auttamaan poistamaan niin kutsuttu takaisinsoitto-helvetti. Generaattoreita käytetään toiminnon pysäyttämiseen. Tämä saavutetaan käyttämällä 'tuotto' -menetelmää asynkronisessa toiminnossa.