Node.js Generatoren & Vergelijk met terugbelverzoeken

Inhoudsopgave:

Anonim

In deze tutorial gaan we leren over generatoren en hun verschillen met callbacks

Wat zijn generatoren?

Generatoren zijn de laatste tijd behoorlijk beroemd geworden in Node.js en dat komt waarschijnlijk door wat ze kunnen.

  • Generatoren zijn functie-uitvoeringen die kunnen worden onderbroken en op een later moment kunnen worden hervat.
  • Generatoren zijn handig bij het uitvoeren van concepten als 'luie uitvoering'. Dit betekent in feite dat door de uitvoering op te schorten en naar believen te hervatten, we alleen waarden kunnen ophalen als dat nodig is.

Generatoren hebben de onderstaande 2 belangrijkste methoden

  1. Opbrengstmethode - De opbrengstmethode wordt aangeroepen in een functie om de uitvoering van de functie te stoppen op de specifieke regel waar de opbrengstmethode wordt aangeroepen.
  2. Volgende methode - Deze methode wordt aangeroepen vanuit de hoofdtoepassing om de uitvoering van een functie met een opbrengstmethode te hervatten. De uitvoering van de functie gaat door tot de volgende opbrengstmethode of tot het einde van de methode.

Laten we eens kijken naar een voorbeeld van hoe generatoren kunnen worden gebruikt.

In ons voorbeeld hebben we een eenvoudige Add-functie die 2 getallen toevoegt, maar we zullen de uitvoering van de methode op verschillende punten blijven stoppen om te laten zien hoe generatoren kunnen worden gebruikt.

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

Code Verklaring: -

  1. De eerste stap is om onze generator "functie" te definiëren. Merk op dat dit wordt gedaan door een "*" toe te voegen aan het functietrefwoord. We definiëren dan een functie genaamd Add waaraan de parameter x moet doorgegeven worden.
  2. Het zoekwoord opbrengst is specifiek voor generatoren. Dit maakt het een krachtig construct om een ​​functie midden in iets te pauzeren. Dus hier wordt de uitvoering van de functie gestopt totdat we de functie next () aanroepen, wat zal worden gedaan in stap 4. Op dit punt wordt de waarde van x 6 en wordt de uitvoering van de functie gestopt.
  3. Dit is waar we eerst de generatorfunctie aanroepen en de waarde van 5 naar onze Add-functie sturen. Deze waarde wordt vervangen in de x-parameter van onze Add-functie.
  4. Zodra we de functie next () aanroepen, hervat de functie Add () de uitvoering. Wanneer de volgende instructie var y = yield (null) wordt uitgevoerd, stopt de functie Add () opnieuw met uitvoeren.
  5. Nadat u de functie next () opnieuw hebt aangeroepen, worden de volgende instructies uitgevoerd en wordt de gecombineerde waarde van x = 5 en y = 6 toegevoegd en geretourneerd.

Terugbellen versus generatoren

Generatoren worden gebruikt om het probleem op te lossen van wat bekend staat als callback hell. Soms raken callback-functies zo genest tijdens de ontwikkeling van een Node.js-applicatie dat het gewoon te ingewikkeld wordt om callback-functies te gebruiken.

Dit is waar generatoren nuttig zijn. Een van de meest voorkomende voorbeelden hiervan is het maken van timerfuncties.

Laten we het onderstaande voorbeeld bekijken van hoe generatoren nuttig kunnen blijken te zijn bij callbacks.

Ons voorbeeld zal slechts een eenvoudige tijdvertragingsfunctie creëren. We zouden deze functie dan willen noemen met een vertraging van 1000, 2000 en 3000 ms.

Stap 1) Definieer onze terugbelfunctie met de benodigde tijdvertragingscode.

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

Code Verklaring: -

  1. Hier maken we een functie genaamd Timedelay met een parameter genaamd ptime. Dit kost de nodige vertraging die we in onze applicatie willen introduceren.
  2. De volgende stap is om gewoon een bericht te maken, dat aan de gebruiker wordt weergegeven en zegt dat de toepassing gedurende deze vele milliseconden zal pauzeren.

Stap 2) Laten we nu eens kijken naar de code als we callbacks zouden opnemen. Stel dat we callbacks willen opnemen op basis van de waarde van 1000, 2000 en 3000 milliseconden, dan laat de onderstaande code zien hoe we deze zouden moeten implementeren met callbacks.

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

Code Verklaring: -

  1. We noemen de Timedelay als een callback met 1000 als waarde.
  2. Vervolgens willen we de Timedelay-functie weer aanroepen met 2000 als waarde.
  3. Ten slotte willen we de functie Timedelay opnieuw aanroepen met 3000 als waarde.

Aan de bovenstaande code kun je zien dat het rommeliger wordt omdat we de functie meerdere keren willen aanroepen.

Stap 3) Laten we nu eens kijken hoe we dezelfde code kunnen implementeren met behulp van generatoren. Aan de hand van onderstaande code kun je nu zien hoe eenvoudig het is geworden om de Timedelay-functie met generatoren te implementeren.

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

Code Verklaring: -

  1. We definiëren eerst een generatorfunctie die zal worden gebruikt om onze Timedelay-functie aan te roepen.
  2. We noemen de Yield-functie samen met de Timedelay-functie met 1000 als parameterwaarde.
  3. We noemen dan de Yield-functie samen met de Timedelay-functie met 2000 als parameterwaarde.
  4. Ten slotte noemen we de Yield-functie samen met de Timedelay-functie met 3000 als parameterwaarde.

Overzicht

Generatoren kunnen ook worden gebruikt om de problemen met geneste callbacks te verlichten en helpen bij het verwijderen van wat bekend staat als de callback-hel. Generatoren worden gebruikt om de verwerking van een functie te stoppen. Dit wordt bereikt door gebruik te maken van de 'yield'-methode in de asynchrone functie.