Latest web development tutorials

node.js EventEmitter

Node.js wszystkim asynchroniczne Operacja We / Wy po zakończeniu wyśle ​​zdarzenie do kolejki zdarzeń.

Node.js którym wiele obiektów rozproszonych wydarzenie: rozproszona obiektu net.Server zdarzenia za każdym razem nowego połączenia, a obiekty fs.readStream będą wydawane w przypadku plik jest otwarty kiedy. Wszystkie te obiekty są generowane zdarzenia events.EventEmitter instancji.


EventEmitter klasy

Moduł zdarzeń zapewnia tylko jeden obiekt: events.EventEmitter. Rdzeń EventEmitter jest pakiet funkcji wyzwalanych zdarzeń i detektor zdarzeń.

Można ( "Wydarzenia") autorstwa wymagają, aby uzyskać dostęp do modułu.

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

EventEmitter W przypadku wystąpienia błędu, gdy obiekt jest tworzony, będzie wyzwalać zdarzenie "błędu". Podczas dodawania nowego słuchacza, zdarzenie "newListener" jest wyzwalane, gdy słuchacz jest usuwany, zdarzenie "removeListener 'jest wyzwalany.

Tutaj używamy prosty przykład pokazuje EventEmitter wykorzystania:

//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
	console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 
	event.emit('some_event'); 
}, 1000); 

Wyniki wykonania są następujące:

Uruchomić ten kod, jedną sekundę po wyjściu konsoli"zdarzeń some_event spust".Zasadą jest, że obiekt jest zarejestrowana wydarzenie some_event przypadku słuchacza, a następnie wysyłamy wydarzenia some_event przez setTimeout 1000 milisekund po zakończeniu imprezy w obiekcie, a następnie zwraca some_event słuchaczem.

$ node event.js 
some_event 事件触发

Każdy EventEmitter wydarzenie przez nazwę wydarzenia i szeregu parametrów, nazwa zdarzenia jest ciągiem znaków, zwykle wyrażone pewne semantyka. Dla każdego zdarzenia, EventEmitter obsługuje kilka detektor zdarzeń.

Gdy wystąpi zdarzenie, zdarzenie rejestracji zdarzeń są kolejno nazywane jako argument parametru zdarzenia oddzwaniania.

Weźmy następujący przykład ilustruje ten proces:

//event.js 文件
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
	console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
	console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 

Uruchom powyższy kod, należy uruchomić w następujący sposób:

$ node event.js 
listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数

Powyższy przykład, emiter someEvent zarejestrowane dla tego wydarzenia, dwa detektory zdarzeń, a następnie wywołane zdarzenie someEvent.

Wyniki operacyjne można zobaczyć w funkcji słuchacza zwrotnego dwóch zdarzeń została wywołana. Jest to najprostszy EventEmitter wykorzystanie.

EventEmitter zapewnia szereg atrybutów, takich jakon i emitują.na funkcja służy do powiązaniafunkcji zdarzeń,emitują atrybut jest używany do wyzwalania zdarzenia. Następny patrzymy EventEmitter specyficzne właściwości opisane.

sposób

Nie. Sposób i opis
1 addListener (zdarzenie, słuchacza)
Dodaj słuchacza dla określonego słuchacza zdarzenia do końca tablicy.
2 on (event, słuchacza)
Dla określonego zdarzenia rejestracji słuchacza akceptuje zdarzenie ciąg i funkcji zwrotnej.
server.on('connection', function (stream) {
  console.log('someone connected!');
});
3 raz (zdarzenie, słuchacza)
Zarejestruj pojedynczego słuchacza dla określonego zdarzenia, że ​​większość słuchaczy wywoła raz, od razu po zwolnieniu spustu słuchacza.
server.once('connection', function (stream) {
  console.log('Ah, we have our first user!');
});
4 removeListener (zdarzenie, słuchacza)
Usuwa określony wydarzenie do słuchacza, słuchacz musi być zdarzenie zarejestrowała słuchaczy.
var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
5 removeAllListeners ([wydarzenie])
Usuwa wszystkie detektory dla wszystkich zdarzeń, w przypadku określonym przypadku usunięcia określonego zdarzenia dla wszystkich słuchaczy.
6 setMaxListeners (n)
Domyślnie EventEmitters jeśli dodać słuchaczy ponad 10 wygeneruje komunikat ostrzegawczy. Funkcja setMaxListeners stosuje się do zwiększania liczby słuchaczy granicach domyślnych.
7 słuchaczy (event)
Zwraca tablicę słuchaczy dla określonego zdarzenia.
8 emitują (event [arg1], [arg2], [...])
Każdy parametry kolejność wykonywania słuchaczem, jeśli nie są zarejestrowane detektor zdarzeń zwraca wartość true, w przeciwnym razie zwraca false.

metody klas

Nie. Sposób i opis
1 listenerCount (emiter, wydarzenie)
Zwraca liczbę słuchaczy dla określonego zdarzenia.

wydarzenie

Nie. Opis i wydarzenia
1 newListener
  • Łańcuch nazwa imprezy- Impreza

  • Słuchacz - funkcja obsługi zdarzeń

Zdarzenie jest wywoływane podczas dodawania nowego słuchacza.

2 removeListener
  • Łańcuch nazwa imprezy- Impreza

  • Słuchacz - funkcja obsługi zdarzeń

Usuwa detektor z określonej tablicy słuchacza. Zauważ, że to się zmieni w indeksie jest to, że słuchacz po słuchacza usunięte.

Przykłady

Poniższe przykłady przez połączenie (połączenia) wydarzenie pokazuje EventEmitter aplikacje klasy.

Tworzenie main.js pliku, w sposób następujący:

var events = require('events');
var eventEmitter = new events.EventEmitter();

// 监听器 #1
var listener1 = function listener1() {
   console.log('监听器 listener1 执行。');
}

// 监听器 #2
var listener2 = function listener2() {
  console.log('监听器 listener2 执行。');
}

// 绑定 connection 事件,处理函数为 listener1 
eventEmitter.addListener('connection', listener1);

// 绑定 connection 事件,处理函数为 listener2
eventEmitter.on('connection', listener2);

var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

// 处理 connection 事件 
eventEmitter.emit('connection');

// 移除监绑定的 listener1 函数
eventEmitter.removeListener('connection', listener1);
console.log("listener1 不再受监听。");

// 触发连接事件
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

console.log("程序执行完毕。");

Kod powyżej wyników testu przedstawiają się następująco:

$ node main.js
2 个监听器监听连接事件。
监听器 listener1 执行。
监听器 listener2 执行。
listener1 不再受监听。
监听器 listener2 执行。
1 个监听器监听连接事件。
程序执行完毕。

zdarzenie błędu

EventEmitter określa specjalny event błędów, zawiera on błąd semantyczny, chcemy normalnie wywołać zdarzenie błędu w obliczu wyjątków.

Gdy błąd zostanie uruchomiony, EventEmitter zastrzec, że w przypadku braku odpowiedzi na słuchacza, node.js użyje go jako wyjątek, wyjść z programu z komunikatem o błędzie.

Aby kierować na ogół wywoła ustawienia detektora zdarzeń błędów uniknąć napotkania błędu w całej awarii programu. Na przykład:

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.emit('error'); 

Prowadzony jest wyświetlany następujący komunikat o błędzie:

node.js:201 
throw e; // process.nextTick error, or 'error' event on first tick 
^ 
Error: Uncaught, unspecified 'error' event. 
at EventEmitter.emit (events.js:50:15) 
at Object.<anonymous> (/home/byvoid/error.js:5:9) 
at Module._compile (module.js:441:26) 
at Object..js (module.js:459:10) 
at Module.load (module.js:348:31) 
at Function._load (module.js:308:12) 
at Array.0 (module.js:479:10) 
at EventEmitter._tickCallback (node.js:192:40) 

Dziedziczenie EventEmitter

Przez większość czasu nie korzystać bezpośrednio EventEmitter, ale odziedziczył go w obiekt. Łącznie fs, Netto, http, w tym, o ile podstawowe moduły wsparcia reagowania na incydenty są podklasy EventEmitter.

Dlaczego? Istnieją dwa powody:

Po pierwsze, obiekt posiada funkcjonalność fizycznej realizacji imprez spełniających monitor emisji i semantykę, zdarzenie powinno być obiektem.

Po drugie, mechanizm obiekt JavaScript jest, wieloczęściowe wsparcie prototyp dziedziczenie oparte obiekty EventEmitter nie zakłócić oryginalnego dziedziczenia.