I Node.js många av objekten i miljön avger händelser, till exempel avger en TCP -server en typhändelse ansluta varje gång en ny klient ansluter eller en ström av filer avger information varje gång en information läses.
Detta i Node.js är vad som kallas händelsemitterare, som tillåter utvecklare möjligheten att prenumerera på händelser, där det prenumererar på en funktion ring tillbaka som kommer att åberopas varje gång en händelse i händelsemitteren inträffar. Vi kan till och med skapa våra egna evenemangssändare tack vare pseudoklassen EventEmitter.
Men för att komma in med händelsemitterarna måste vi först vara tydliga med vissa begrepp, till exempel några mönster för dessa funktioner, typer av händelser och till och med lyssnare.
KravFör att utföra de övningar som föreslås i denna handledning måste vi ha en funktionell installation av Node.js i vårt system kan vi ta en titt på denna handledning innan vi fortsätter att fördjupa oss i den. Det är också viktigt att kunna ha tillgång till en rich text -editor för att koda exemplen, vi kan använda vad vi än känner oss bekväma med, men för enkel användning rekommenderar vi Sublim text o NotePad ++ som också har plugins för syntaxen JavaScript Y HTML.
Mönster för återuppringning
Asynkron programmering använder inte retur av värden i funktionerna för att ange att den funktionen just har avslutats, men den åberopar den berömda återuppringningen efter att operationen är klar så att vårt program kan fortsätta, där JavaScript Jag leder till denna typ av programmering, låt oss se ett exempel i Ge inte som läser en fil och laddar dess innehåll i minnet:
var fs = require ('fs'); fs.readFile ('file.txt', function (err, fileContent) {if (err) {throw err;} console.log ('File content:', fileContent.toString ());});Vad vi gör här är att vi skickar en anonym funktion som funktionens andra argument fs.readFile, och hur kan vi se att det första argumentet för återuppringningsfunktionen är ett felobjekt, som kommer att ha en instans av felklassen om ett fel uppstår.
Mönster för evenemangssändaren
Den tidigare stilen fungerar perfekt när vi vill meddela att en funktion som vi utför avslutar sitt arbete, men om flera händelser äger rum under denna körning eller många gånger kommer den här stilen inte att fungera som vi vill. Till exempel, om vi vill bli aviserade varje gång informationen är tillgänglig i uttaget, en funktion av typen ring tillbaka standarden kommer inte att hjälpa oss mycket, men det är här händelsemålet kan hjälpa oss.
Händelsemitteren är inget annat än ett objekt som, som namnet indikerar, avger en händelse, där a lyssnare det är en del av koden som binder till denna sändare och lyssnar på vissa typer av händelser, till exempel:
var req = http.request (alternativ, funktion (svar) {response.on ("data", funktion (data) {console.log ("Några svarsdata", data);}); response.on ("end" , function () {console.log ("slutfört svar");});}); begär end ();Detta är en rent förklarande kod, där vi kan se några av stegen för att göra en begäran HTTP till en fjärrserver men det gör att vi kan se hur svarsobjektet är en händelsemitter, som inte bara kan avge data Y slutet men andra typer av evenemang.
Typer av evenemang
Enligt föregående exempel kunde vi se att de avgivna händelserna alltid har en typ, som representeras av en sträng, i det här fallet "data"Y"slutet”, Vilket kommer att vara godtyckliga strängar som anges av händelseutgivaren.
Händelsemitteraren är ett generiskt gränssnitt som serverar alla typer av händelser, men det finns ett specialfall i genomförandet av Ge inte och det är evenemanget fel, där varje händelse i miljön kommer att avge en händelse av denna typ varje gång ett fel uppstår och om utvecklaren väljer att inte lyssna på den här typen av händelser och ett fel uppstår, kommer händelsemätaren att märka det och göra ett undantag i det här fallet . Låt oss se i följande kod hur vi kan simulera detta beteende:
var em = new (require ('events'). EventEmitter) (); em.emit ('händelse1'); em.emit ('fel', nytt fel ('Mitt fel'));Om vi kör det genom konsolen kan vi se hur Ge inte berättar för oss att vi inte hanterar felet och genererar därmed ett okänt undantag:
Eftersom vi har sett hur händelser beter sig på ett generellt sätt, låt oss se hur vi använder händelsemitterande API.
Använda händelsemitter -API: et
Varje objekt som implementerar händelsemitteringsmönstret implementerar en serie händelser som vi kan se nedan:
.addListener - .onDenna metod låter oss lägga till en lyssnare till en händelsetyp.
.elvaMed denna metod kan vi binda en lyssnare till en händelsestyp med tanke på att den kommer att kallas minst en gång.
.removeEventListenerDenna metod gör att vi kan ta bort en lyssnare från en given händelse.
.removeAllEventListenersSlutligen hjälper denna metod oss att ta bort alla lyssnare för en viss typ av händelse.
Efter att redan ha sett vad funktionen för var och en av dessa är, låt oss se hur vi använder dem inom våra program.
Använda .addListener () eller .on () vid återuppringning
Genom att ange en händelsetyp och en funktion ring tillbakakan vi spela in den åtgärd som ska vidtas när en specifik händelse inträffar. Om vi till exempel vill informeras om att en del av data är tillgänglig och avger en händelse med typdata, kan vi göra följande:
function ReceiveData (data) {console.log ("Data erhölls:% j", data); } readFlow.addListener ("data", ReceiveData);Vi kan också använda metoden .on () som bara är en genväg, låt oss se motsvarigheten till den tidigare koden:
function ReceiveData (data) {console.log ("Data erhölls:% j", data); } readFlow.on ("data", mottagningsdata);Vi kan till och med lägga till flera lyssnare för våra evenemang för att lyssna på samma typ av händelse på samma sändare, till exempel:
I det här exemplet är det som görs att binda två funktioner till datatypshändelsen, och där när datahändelsen skickas ut kommer båda strängarna att skrivas ut. Det är viktigt att notera att evenemangsutgivaren är ansvarig för att ringa alla lyssnare registrerade för en händelsestyp, och det kommer att ringa dem i den ordning de registrerades, vilket innebär följande:
- En lyssnare kan inte kallas omedelbart efter att händelsen sänds ut, det är möjligt att andra lyssnare blir uppringda innan.
- Att inte fånga undantag är ohälsosamt beteende för vår kod, så om någon av dessa lyssnare kastar ett fel och inte fastnar, är det möjligt att vissa lyssnare inte kallas, där vi kan illustrera detta i följande exempel:
Där i detta exempel den andra lyssnaren inte kommer att åberopas sedan den första kastade ett fel.
Använda .removeListener ()
Om vi inte längre vill bli informerade om ändringar av en specifik händelse eller ett objekt kan vi stoppa inspelningen genom att ange typen av händelse och återuppringningsfunktionen enligt följande:
Använda .once ()
Om vår applikation lyssnar efter en händelse som kommer att inträffa minst en gång eller om vi bara är intresserade av att det bara ska hända en gång kan vi använda .elva(), som lägger till lyssnaren och tar bort den när den första händelsen inträffar:
Använda .removeAllListeners ()
Slutligen kan vi ta bort alla lyssnare för en viss händelsestyp från en händelsemitter enligt följande:
issuer.removeAllListeners (typ);
Skapa evenemangsutsändaren
Händelsemitteraren ger oss ett generiskt sätt att skapa gränssnitt, eftersom vi binder händelser istället för funktioner, vilket gör vårt program mer flexibelt, även om vi vill använda mönstret för Node.js Under hela vår applikation kan vi skapa en pseudoklass och ärva från EventEmitter som följer:
util = require ('util'); var EventEmitter = require ('events'). EventEmitter; var MyClass = function () {} util.inherits (MyClass, EventEmitter);På detta sätt metoderna för EventEmitter De kommer att vara tillgängliga för vår instans och vi kan använda dem utan problem och på detta sätt Min klass kan avge händelser:
MyClass.prototype.someMethod = function () {this.emit ("anpassad händelse", "argument 1", "argument 2"); };Här när någon metod kallas i fallet med Min klass, exemplet avger en händelse som kallas anpassad händelse, där den i sin tur avger två olika data, argument 1 och argument 2, som kommer att skickas till händelsens lyssnare. Slutligen i fallet med Min klass på klientsidan kan du lyssna på anpassad händelse som följer:
var MyClass = new MyClass (); MyClass.on ('anpassad händelse', funktion (str1, str2) {console.log ('Anpassad händelse lyssnade med argument str1% s och str2% s!', Str1, str2);});Som vi kan se hjälper användningen av händelser tillsammans med händelsemitteren oss att kommunicera med vår applikation och så här avslutade vi denna handledning, där vi kunde gå längre än asynkron programmering och tillämpa metoder som hjälper oss att upprätthålla en standard och optimal mönster. för våra applikationer.