Zpracování událostí v Node.js

v Node.js mnoho objektů přítomných v prostředí vysílá události, například server TCP vysílá událost typu připojit pokaždé, když se připojí nový klient nebo proud souborů vysílá informace pokaždé, když je přečtena určitá informace.

Toto v Node.js je to, čemu se říká emitory událostí, které vývojářům umožňují možnost odebírat události, kde se přihlásí k odběru funkce zpětné volání který bude vyvolán pokaždé, když dojde k události v emitoru události. Díky pseudotřídě můžeme dokonce vytvářet vlastní vysílače událostí Vysílač událostí.

Abychom však mohli vstoupit s vysílači událostí, musíme si nejprve ujasnit některé pojmy, například některé vzorce těchto funkcí, typy událostí a dokonce i posluchače.

PožadavkyAbychom mohli provádět cvičení navržená v tomto tutoriálu, musíme mít funkční instalaci Node.js v našem systému se můžeme podívat na tento tutoriál, než se do něj budeme dále ponořit. Je také důležité mít přístup k editoru formátovaného textu pro kódování příkladů, můžeme použít cokoli, co nám vyhovuje, nicméně pro jeho snadné použití doporučujeme Vznešený text o NotePad ++, které mají také doplňky pro syntaxi JavaScript Y HTML.

Vzor pro zpětná volání


Asynchronní programování nepoužívá návrat hodnot ve funkcích k označení, že tato funkce právě skončila, ale vyvolá slavné zpětné volání po dokončení operace, aby náš program mohl pokračovat, kde JavaScript Vedu k tomuto typu programování, podívejme se na příklad v Nedávej který načte soubor a načte jeho obsah do paměti:
 var fs = require ('fs'); fs.readFile ('file.txt', function (err, fileContent) {if (err) {throw err;} console.log ('File content:', fileContent.toString ());});
Děláme zde to, že jako druhý argument funkce posíláme anonymní funkci fs.readFile, a jak můžeme vidět první argument funkce zpětného volání je chybový objekt, který bude mít instanci třídy Error, pokud dojde k chybě.

Vzor pro vysílač událostí


Předchozí styl funguje perfektně, když chceme upozornit, že funkce, kterou provádíme, dokončí svou práci, ale v případě, že během tohoto spuštění nebo mnohokrát proběhne více událostí, tento styl nebude fungovat, jak chceme. Pokud například chceme být upozorněni pokaždé, když jsou informace k dispozici v soketu, funkce typu zpětné volání standard nám moc nepomůže, ale právě zde nám může pomoci emitor událostí.

Vysílač událostí není nic jiného než objekt, který, jak naznačuje jeho název, vysílá událost, kde a posluchač je součástí kódu, který se váže na tento vysílač a poslouchá určité typy událostí, jako například:

 var req = http.request (možnosti, funkce (odpověď) {response.on ("data", funkce (data) {console.log ("Some response data", data);}); response.on ("end" , function () {console.log ("Complete response");});}); req.end ();
Toto je čistě vysvětlující kód, kde můžeme vidět některé kroky k podání žádosti HTTP na vzdálený server, ale umožňuje nám vidět, jak je objekt odezvy emitor událostí, který může vysílat nejen data Y konec ale i jiné typy akcí.

Druhy událostí


Podle předchozího příkladu jsme viděli, že emitované události mají v tomto případě vždy typ, který je reprezentován řetězcem "data"Y"konec”, Což budou libovolné řetězce určené vydavatelem události.

Vysílač událostí je obecné rozhraní, které slouží jakémukoli typu události, ale při implementaci existuje zvláštní případ Nedávej a je to událost chyba, kde každá událost v prostředí vysílá událost tohoto typu pokaždé, když dojde k chybě, a pokud se vývojář rozhodne tento typ události neposlouchat a dojde k chybě, emitor události si toho všimne a v tomto případě vyvolá výjimku . Podívejme se v následujícím kódu, jak můžeme toto chování simulovat:

 var em = new (require ('events'). EventEmitter) (); em.emit ('event1'); em.emit ('chyba', nová chyba ('Moje chyba'));
Když to spustíme přes konzolu, uvidíme, jak Nedávej nám říká, že s chybou nezacházíme, čímž generujeme nezachycenou výjimku:

Protože jsme viděli, jak se události chovají obecně, podívejme se, jak používáme API pro emitor událostí.

Použití rozhraní API pro emitor událostí


Jakýkoli objekt, který implementuje vzor emitoru událostí, implementuje řadu událostí, jak vidíme níže:

.addListener - .onTato metoda nám umožňuje přidat posluchač k typu události.
.jedenáctPomocí této metody můžeme svázat posluchače s typem události, protože bude vyvolán alespoň jednou.
.removeEventListenerTato metoda nám umožní odebrat posluchače z jakékoli dané události.
.removeAllEventListenersNakonec nám tato metoda pomáhá odebrat všechny posluchače pro daný typ události.
Když jsme již viděli, jaké jsou funkce každého z nich, podívejme se, jak je používáme v našich programech.

Použití .addListener () nebo .on () při zpětných voláních


Zadáním typu události a funkce zpětné volání, můžeme zaznamenat akci, která má být provedena, když dojde ke konkrétní události. Pokud například chceme být informováni o tom, že je k dispozici část dat a vygenerovat událost dat typu, můžeme provést následující:
 funkce receiveData (data) {console.log ("Data byla získána:% j", data); } readFlow.addListener ("data", receiveData);
Můžeme také použít metodu .on () což je jen zkratka, podívejme se na ekvivalent předchozího kódu:
 funkce receiveData (data) {console.log ("Data byla získána:% j", data); } readFlow.on ("data", receiveData);
Můžeme dokonce přidat více posluchačů pro naše události, abychom mohli poslouchat stejný typ události na stejném vysílači, například:

V tomto příkladu se provede vazba dvou funkcí na událost datového typu a tam, kde se po vygenerování datové události vytisknou oba řetězce. Je důležité si uvědomit, že za volání všech je zodpovědný vydavatel události posluchači zaregistrovaní pro typ události a vyvolá je v pořadí, v jakém byli zaregistrováni, což znamená následující:

  • Posluchače nelze zavolat bezprostředně po vyslání události, je možné, že se předtím zavolají další posluchači.
  • Nechytání výjimek je pro náš kód nezdravé chování, takže pokud některý z těchto posluchačů vyvolá chybu a není chycen, je možné, že někteří posluchači nejsou voláni, kde to můžeme ilustrovat na následujícím příkladu:

Kde v tomto případě nebude vyvolán druhý posluchač, protože první způsobil chybu.

Použití .removeListener ()


Pokud kdykoli již nechceme být informováni o změnách konkrétní události nebo objektu, můžeme nahrávání zastavit zadáním typu události a funkce zpětného volání následujícím způsobem:

Použití .once ()


V případě, že naše aplikace naslouchá události, která se stane alespoň jednou, nebo pokud nás zajímá, aby se to stalo pouze jednou, můžeme použít .jedenáct(), který přidá posluchače a odebere jej, jakmile dojde k první události:

Použití .removeAllListeners ()


Nakonec můžeme odebrat všechny posluchače pro konkrétní typ události z emitoru události následujícím způsobem:
 emitent.removeAllListeners (typ);

Vytvoření emitoru události


Vysílač událostí nám poskytuje obecný způsob vytváření rozhraní, protože místo funkcí spojujeme události, čímž je náš program flexibilnější, i když chceme použít vzor Node.js V celé naší aplikaci můžeme vytvořit pseudotřídu a dědit z ní Vysílač událostí jak následuje:
 util = require ('util'); var EventEmitter = require ('events'). EventEmitter; var MyClass = function () {} util.inherits (MyClass, EventEmitter);
Tímto způsobem metody Vysílač událostí Budou k dispozici pro naši instanci a můžeme je používat bez problémů a tímto způsobem Moje třída může vysílat události:
 MyClass.prototype.someMethod = function () {this.emit ("vlastní událost", "argument 1", "argument 2"); };
Tady kdy nějaká metoda se nazývá v případě Moje třída, příklad vysílá událost s názvem událost na míru, kde zase vysílá dvě různá data, argument 1 a argument 2, které budou odeslány posluchačům událostí. Nakonec v případech Moje třída na straně klienta můžete poslouchat událost na míru jak následuje:
 var MyClass = new MyClass (); MyClass.on ('vlastní událost', funkce (str1, str2) {console.log ('vlastní událost poslouchána s argumenty str1% s a str2% s!', Str1, str2);});
Jak vidíme, použití událostí společně s emitorem událostí nám pomáhá komunikovat s naší aplikací a tím jsme zakončili tento tutoriál, kde jsme mohli jít nad rámec asynchronního programování a používání postupů, které nám pomáhají udržovat standardní a optimální vzor. pro naše aplikace.

Vám pomůže rozvoji místa, sdílet stránku s přáteli

wave wave wave wave wave