Obsługa zdarzeń w Node.js

w Node.js wiele obiektów obecnych w środowisku emituje zdarzenia, na przykład serwer TCP emituje zdarzenie typu łączyć za każdym razem, gdy łączy się nowy klient lub strumień plików emituje informacje za każdym razem, gdy część informacji jest odczytywana.

To w Node.js to tak zwane emitery zdarzeń, które umożliwiają programistom subskrybowanie zdarzeń, w których subskrybuje funkcję oddzwonić który będzie wywoływany za każdym razem, gdy wystąpi zdarzenie w emiterze zdarzeń. Dzięki pseudo-klasie możemy nawet tworzyć własne emitery zdarzeń Emiter zdarzeń.

Aby jednak wejść z emiterami zdarzeń, musimy najpierw mieć jasność co do pewnych pojęć, takich jak niektóre wzorce tych funkcji, rodzaje zdarzeń, a nawet słuchacze.

WymaganiaAby wykonać ćwiczenia zaproponowane w tym samouczku, musimy mieć funkcjonalną instalację Node.js w naszym systemie możemy rzucić okiem na ten samouczek, zanim przejdziemy dalej. Ważne jest również, aby mieć dostęp do bogatego edytora tekstu do kodowania przykładów, możemy użyć tego, z czym czujemy się komfortowo, jednak ze względu na łatwość obsługi zalecamy Wzniosły tekst o NotePad ++, który ma również wtyczki do składni JavaScript Tak HTML.

Wzór dla wywołań zwrotnych


Programowanie asynchroniczne nie wykorzystuje zwracania wartości w funkcjach do oznaczenia, że ​​funkcja właśnie się zakończyła, ale wywołuje słynne wywołanie zwrotne po zakończeniu operacji, aby nasz program mógł kontynuować, gdzie JavaScript Prowadzę do tego typu programowania, zobaczmy przykład w Nie dawaj który odczytuje plik i ładuje jego zawartość do pamięci:
 var fs = wymagaj ('fs'); fs.readFile ('file.txt', function (err, fileContent) {if (err) {throw err;} console.log ('zawartość pliku:', fileContent.toString ());});
To, co tutaj robimy, to wysyłanie funkcji anonimowej jako drugiego argumentu funkcji fs.readFile, a jak możemy zobaczyć, że pierwszym argumentem funkcji zwrotnej jest obiekt błędu, który będzie miał instancję klasy Error, jeśli wystąpi błąd.

Wzór dla emitera zdarzeń


Poprzedni styl sprawdza się doskonale, gdy chcemy powiadomić, że funkcja, którą wykonujemy, kończy swoją pracę, ale w przypadku, gdy w trakcie tego wykonania lub wiele razy ma miejsce wiele zdarzeń, ten styl nie będzie działał tak, jak byśmy tego chcieli. Na przykład, jeśli chcemy być powiadamiani za każdym razem, gdy informacja jest dostępna w gnieździe, funkcja typu oddzwonić standard niewiele nam pomoże, ale tutaj może nam pomóc emiter zdarzeń.

Emiter zdarzeń to nic innego jak obiekt, który, jak sama nazwa wskazuje, emituje zdarzenie, gdzie a słuchacz jest to część kodu, który wiąże się z tym emiterem i nasłuchuje pewnych typów zdarzeń, takich jak:

 var req = http.request (options, function (response) {response.on ("data", function (data) {console.log ("Niektóre dane odpowiedzi", dane);}); response.on (" end " , function () {console.log ("ukończona odpowiedź");});}); wym.koniec ();
Jest to kod czysto wyjaśniający, w którym możemy zobaczyć niektóre kroki, aby złożyć wniosek HTTP na zdalny serwer, ale pozwala nam zobaczyć, jak obiekt odpowiedzi jest emiterem zdarzeń, który może emitować nie tylko dane Tak koniec ale także inne rodzaje wydarzeń.

Rodzaje wydarzeń


Zgodnie z poprzednim przykładem mogliśmy zobaczyć, że emitowane zdarzenia zawsze mają typ, który jest reprezentowany przez łańcuch, w tym przypadku "dane„T”koniec”, które będą dowolnymi ciągami wyznaczonymi przez wystawcę zdarzeń.

Emiter zdarzeń to ogólny interfejs, który obsługuje dowolny typ zdarzenia, ale istnieje specjalny przypadek w implementacji Nie dawaj i to jest wydarzenie błąd, gdzie każde zdarzenie w środowisku wyemituje zdarzenie tego typu za każdym razem, gdy wystąpi błąd i jeśli programista zdecyduje się nie nasłuchiwać tego typu zdarzenia i wystąpi błąd, emiter zdarzeń zauważy to i zgłosi wyjątek w tym przypadku . Zobaczmy w poniższym kodzie, jak możemy zasymulować to zachowanie:

 var em = new (wymagane ('zdarzenia'). EventEmitter) (); em.emit („zdarzenie1”); em.emit („błąd”, nowy błąd („mój błąd”));
Jeśli uruchomimy go przez konsolę, zobaczymy, jak Nie dawaj informuje nas, że nie obsługujemy błędu, generując w ten sposób nieprzechwycony wyjątek:

Ponieważ widzieliśmy, jak ogólnie zachowują się zdarzenia, zobaczmy, jak używamy API emitera zdarzeń.

Korzystanie z API emitera zdarzeń


Każdy obiekt, który implementuje wzorzec emitera zdarzeń, implementuje serię zdarzeń, jak widać poniżej:

.addListener - .onTa metoda pozwala nam dodać detektor do typu zdarzenia.
.jedenaścieZa pomocą tej metody możemy powiązać detektor z typem zdarzenia, pod warunkiem, że zostanie wywołany przynajmniej raz.
.removeEventListenerTa metoda pozwoli nam usunąć słuchacza z dowolnego zdarzenia.
.removeAllEventListenersWreszcie ta metoda pomaga nam usunąć wszystkie detektory dla danego typu zdarzenia.
Widząc już, jaka jest funkcja każdego z nich, zobaczmy, jak używamy ich w naszych programach.

Używanie .addListener() lub .on() w wywołaniach zwrotnych


Określając typ zdarzenia i funkcję oddzwonić, możemy nagrać akcję, którą należy podjąć, gdy wystąpi określone zdarzenie. Na przykład, jeśli chcemy być poinformowani, że część danych jest dostępna i wyemitować zdarzenie typu data, możemy wykonać następujące czynności:
 function odbierzData (dane) {console.log ("Dane zostały uzyskane:% j", dane); } readFlow.addListener ("dane", odbierzData);
Możemy również skorzystać z metody .na () który jest tylko skrótem, zobaczmy odpowiednik poprzedniego kodu:
 function odbierzData (dane) {console.log ("Dane zostały uzyskane:% j", dane); } readFlow.on ("dane", odbierzData);
Możemy nawet dodać wiele słuchaczy do naszych zdarzeń, aby nasłuchiwać tego samego typu zdarzenia na tym samym nadajniku, na przykład:

W tym przykładzie wykonuje się powiązanie dwóch funkcji ze zdarzeniem typu danych, a po wyemitowaniu zdarzenia danych zostaną wydrukowane oba ciągi. Należy pamiętać, że wydawca zdarzenia jest odpowiedzialny za wywołanie wszystkich słuchacze zarejestrowane dla typu zdarzenia i wywoła je w kolejności, w jakiej zostały zarejestrowane, co oznacza:

  • Słuchacza nie można wywołać natychmiast po wyemitowaniu zdarzenia, możliwe jest, że inne detektory zostaną wywołane wcześniej.
  • Brak wychwytywania wyjątków jest niezdrowym zachowaniem naszego kodu, więc jeśli któryś z tych detektorów zgłosi błąd i nie zostanie przechwycony, możliwe, że niektóre detektory nie zostaną wywołane, co możemy zilustrować w następującym przykładzie:

Gdzie w tym przykładzie drugi słuchacz nie zostanie wywołany, ponieważ pierwszy zgłosił błąd.

Korzystanie z .removeListener()


Jeśli w dowolnym momencie nie chcemy już być informowani o zmianach w konkretnym zdarzeniu lub obiekcie, możemy zatrzymać jego nagrywanie, określając rodzaj zdarzenia i funkcję oddzwaniania w następujący sposób:

Używając .raz ()


W przypadku, gdy nasza aplikacja nasłuchuje zdarzenia, które zdarzy się co najmniej raz lub jeśli zależy nam tylko na tym, aby wydarzyło się tylko raz, możemy użyć .jedenaście(), który dodaje słuchacza i usuwa go po wystąpieniu pierwszego zdarzenia:

Korzystanie z .removeAllListeners ()


Na koniec możemy usunąć wszystkie detektory dla określonego typu zdarzenia z emitera zdarzeń w następujący sposób:
 emitent.removeAllListeners (typ);

Tworzenie emitera zdarzeń


Emiter zdarzeń zapewnia nam ogólny sposób tworzenia interfejsów, ponieważ wiążemy zdarzenia zamiast funkcji, dzięki czemu nasz program jest bardziej elastyczny, nawet jeśli chcemy użyć wzorca Node.js W całej naszej aplikacji możemy stworzyć pseudoklasę i dziedziczyć z Emiter zdarzeń następująco:
 util = wymagaj ('util'); var EventEmitter = wymagaj ('zdarzenia'). EventEmitter; var MyClass = function () {} util.inherits (MyClass, EventEmitter);
W ten sposób metody Emiter zdarzeń Będą dostępne dla naszej instancji i bez problemu będziemy mogli z nich korzystać i w ten sposób Moja klasa może emitować zdarzenia:
 MyClass.prototype.someMethod = function () {this.emit ("zdarzenie niestandardowe", "argument 1", "argument 2"); };
Tutaj, kiedy jakaś metoda nazywa się w przypadku Moja klasa, przykład emituje zdarzenie o nazwie wydarzenie niestandardowe, gdzie z kolei emituje dwa różne dane, argument 1 i argument 2, które zostaną wysłane do detektorów zdarzeń. Wreszcie w przypadkach Moja klasa po stronie klienta można posłuchać wydarzenie niestandardowe następująco:
 var MojaKlasa = nowa MojaKlasa (); MyClass.on („Zdarzenie niestandardowe”, function (str1, str2) {console.log („Zdarzenie niestandardowe nasłuchiwane z argumentami str1% s i str2% s!”, Str1, str2);});
Jak widać wykorzystanie zdarzeń wraz z emiterem zdarzeń pomaga nam komunikować się z naszą aplikacją i tak zakończyliśmy ten samouczek, w którym udało nam się wyjść poza programowanie asynchroniczne i stosowanie praktyk, które pomagają nam utrzymać standard i optymalny wzór dla naszych aplikacji.

Będziesz pomóc w rozwoju serwisu, dzieląc stronę ze swoimi znajomymi

wave wave wave wave wave