Node.js - pętla zdarzeń

Node.js jest aplikacją jednowątkową, ale może obsługiwać współbieżność za pośrednictwem koncepcji event i callbacks. Każdy interfejs API Node.js jest asynchroniczny i jest jednowątkowy, z którego korzystająasync function callsaby zachować współbieżność. Węzeł używa wzorca obserwatora. Wątek węzła przechowuje pętlę zdarzeń i za każdym razem, gdy zadanie zostanie ukończone, wywołuje odpowiednie zdarzenie, które sygnalizuje wykonanie funkcji nasłuchiwania zdarzeń.

Programowanie sterowane zdarzeniami

Node.js intensywnie wykorzystuje zdarzenia i jest to również jeden z powodów, dla których Node.js jest dość szybki w porównaniu z innymi podobnymi technologiami. Gdy tylko Node uruchomi swój serwer, po prostu inicjuje swoje zmienne, deklaruje funkcje, a następnie po prostu czeka na wystąpienie zdarzenia.

W aplikacji sterowanej zdarzeniami zazwyczaj istnieje główna pętla, która nasłuchuje zdarzeń, a następnie wyzwala funkcję wywołania zwrotnego po wykryciu jednego z tych zdarzeń.

Chociaż zdarzenia wyglądają dość podobnie do wywołań zwrotnych, różnica polega na tym, że funkcje zwrotne są wywoływane, gdy funkcja asynchroniczna zwraca swój wynik, podczas gdy obsługa zdarzeń działa na wzorcu obserwatora. Funkcje nasłuchujące zdarzeń działają jakObservers. Za każdym razem, gdy zdarzenie zostanie wyzwolone, jego funkcja detektora zaczyna działać. Node.js ma wiele wbudowanych zdarzeń dostępnych za pośrednictwem modułu zdarzeń i klasy EventEmitter, które są używane do wiązania zdarzeń i detektorów zdarzeń w następujący sposób -

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

Poniżej znajduje się składnia powiązania procedury obsługi zdarzeń ze zdarzeniem -

// Bind event and event  handler as follows
eventEmitter.on('eventName', eventHandler);

Możemy uruchomić zdarzenie programowo w następujący sposób -

// Fire an event 
eventEmitter.emit('eventName');

Przykład

Utwórz plik js o nazwie main.js z następującym kodem -

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

// Create an event handler as follows
var connectHandler = function connected() {
   console.log('connection succesful.');
  
   // Fire the data_received event 
   eventEmitter.emit('data_received');
}

// Bind the connection event with the handler
eventEmitter.on('connection', connectHandler);
 
// Bind the data_received event with the anonymous function
eventEmitter.on('data_received', function() {
   console.log('data received succesfully.');
});

// Fire the connection event 
eventEmitter.emit('connection');

console.log("Program Ended.");

Teraz spróbujmy uruchomić powyższy program i sprawdzić jego dane wyjściowe -

$ node main.js

Powinno dać następujący wynik -

connection successful.
data received successfully.
Program Ended.

Jak działają aplikacje węzłów?

W aplikacji węzła każda funkcja asynchroniczna akceptuje wywołanie zwrotne jako ostatni parametr, a funkcja zwrotna przyjmuje błąd jako pierwszy parametr. Wróćmy ponownie do poprzedniego przykładu. Utwórz plik tekstowy o nazwie input.txt z następującą zawartością.

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Utwórz plik js o nazwie main.js z następującym kodem -

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
   if (err) {
      console.log(err.stack);
      return;
   }
   console.log(data.toString());
});
console.log("Program Ended");

Tutaj fs.readFile () jest funkcją asynchroniczną, której celem jest odczytanie pliku. Jeśli podczas operacji odczytu wystąpi błąd, plikerr object będzie zawierał odpowiedni błąd, w przeciwnym razie dane będą zawierały zawartość pliku. readFile przekazuje err i dane do funkcji zwrotnej po zakończeniu operacji odczytu, która ostatecznie wypisuje zawartość.

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!