Latest web development tutorials

Node.js EventEmitter

Node.js alle asynchronen I / O-Operation nach Abschluss wird ein Ereignis in das Ereigniswarteschlange senden.

Node.js, die viele Objekte Veranstaltung verteilt sind: ein verteiltes Objekt net.Server ein Ereignis jedes Mal, wenn eine neue Verbindung, ein fs.readStream Objekte werden im Falle ausgegeben werden eine Datei, wenn sie geöffnet wird. Alle diese Aufgaben werden Ereignisse events.EventEmitter Instanz erzeugt.


EventEmitter Klasse

Ereignisse Modul bietet nur ein Objekt: events.EventEmitter. Kern EventEmitter ist ereignisgesteuert und Funktionspaket Ereignis-Listener.

Sie können ( "Events") durch erfordern, um das Modul zuzugreifen.

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

EventEmitter Tritt ein Fehler auf, wenn ein Objekt instanziiert wird, wird es die "Fehler" Ereignis auslösen. Wenn Sie einen neuen Hörer Hinzufügen 'newListener' Ereignis ausgelöst wird, wenn der Hörer abgenommen wird, 'removeListener' Ereignis ausgelöst wird.

Hier verwenden wir ein einfaches Beispiel EventEmitter Nutzung zeigt:

//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); 

Ausführungsergebnisse sind wie folgt:

Führen Sie diesen Code, eine Sekunde nach dem Konsolenausgabe'some_event Triggerereignis ".Das Prinzip ist, dass das Objekt Ereignis some_event Ereignis eines Hörers registriert ist, und dann Ereignisse, die wir senden durch SetTimeout 1000 Millisekunden nach dem Ereignis in dem Objekt some_event, dann ruft some_event Zuhörer.

$ node event.js 
some_event 事件触发

Jedes Ereignis EventEmitter von einem Ereignisnamen und eine Reihe von Parametern, ist Ereignisname eine Zeichenfolge, in der Regel ausgedrückt bestimmte Semantik. Für jedes Ereignis unterstützt EventEmitter mehrere Ereignis-Listener.

Wenn das Ereignis eintritt, um das Ereignis zu Ereignis-Listener registrieren sequentiell als Callback-Ereignisparameter Argument aufgerufen werden.

Lassen Sie uns das folgende Beispiel nehmen veranschaulicht diesen Prozess:

//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 参数'); 

Führen Sie den Code oben, führen Sie wie folgt vor:

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

Das obige Beispiel, Emitter jeweiliges Ereignis für das Ereignis registriert, zwei Event-Listener, dann ausgelöst, someevent Ereignis.

Die operativen Ergebnisse können in zwei Event-Listener-Rückruffunktion gesehen werden aufgerufen wurde. Dies ist EventEmitter einfachste Nutzung.

EventEmitter bietet eine Reihe von Attributen, wie etwaauf und emittieren.On - Funktion verwendet wird , Event -Funktionzubinden,emittieren Attribut verwendet, um ein Ereignis auszulösen. Als nächstes sehen wir EventEmitter spezifischen Eigenschaften beschrieben.

Weg

Nein. Method & Beschreibung
1 addListener (Ereignis, Hörer)
Fügen Sie einen Listener für einen bestimmten Ereignis Zuhörer bis zum Ende des Arrays.
2 auf (Ereignis, Hörer)
Für das angegebene Ereignis einen Listener registrieren akzeptiert einen String-Event und eine Callback-Funktion.
server.on('connection', function (stream) {
  console.log('someone connected!');
});
3 einmal (Ereignis, Hörer)
Registrieren Sie einen einzigen Zuhörer für das Ereignis zurück, dass die meisten Zuhörer einmal ausgelöst wird, unmittelbar nach dem Trigger Zuhörer loslassen.
server.once('connection', function (stream) {
  console.log('Ah, we have our first user!');
});
4 removeListener (Ereignis, Hörer)
Entfernt das angegebene Ereignis für einen Hörer, muss der Hörer das Ereignis registriert Zuhörer hat.
var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
5 removeAllListeners ([Veranstaltung])
Entfernt alle Zuhörer für alle Ereignisse, wenn ein bestimmtes Ereignis, entfernen Sie das angegebene Ereignis für alle Zuhörer.
6 setMaxListeners (n)
Standardmäßig hinzufügen, wenn Sie EventEmitters Hörer über 10 ausgeben wird eine Warnmeldung angezeigt. setMaxListeners Funktion wird verwendet, um die Anzahl der Hörer der Standard-Grenzen zu erhöhen.
7 Hörer (event)
Gibt ein Array von Listener für das Ereignis zurück.
8 emittieren (Ereignis, [arg1], [arg2], [...])
Jeder Zuhörer Parameter Ausführungsreihenfolge, wenn es registrierte Ereignis-Listener gibt true zurück, andernfalls false zurück.

Klassenmethoden

Nein. Method & Beschreibung
1 listenerCount (Emitter, Event)
Gibt die Anzahl der Zuhörer für das Ereignis zurück.

Ereignis

Nein. Events & Beschreibung
1 newListener
  • Ereignis - Zeichenfolge Name der Veranstaltung

  • Zuhörer - das Event - Handling - Funktion

Das Ereignis wird ausgelöst, wenn Sie einen neuen Listener hinzufügen.

2 removeListener
  • Ereignis - Zeichenfolge Name der Veranstaltung

  • Zuhörer - das Event - Handling - Funktion

Entfernen Sie einen Listener aus dem angegebenen Listener-Array. Beachten Sie, dass diese in den Index zu ändern, ist, dass der Hörer nach Zuhörers gelöscht.

Beispiele

Die folgenden Beispiele über die Verbindung (Verbindung) Ereignis demonstriert EventEmitter Anwendungen ermöglichen.

Erstellen Sie main.js Datei wie folgt:

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("程序执行完毕。");

Code oben, sind die Ausführungsergebnisse wie folgt:

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

Fehlerereignis

EventEmitter definiert ein besonderes Ereignis Fehler, es eine semantische Fehler enthält, würden wir normalerweise ein Fehlerereignis angesichts der Ausnahmen auslösen.

Wenn der Fehler ausgelöst wird, EventEmitter sehen vor, dass, wenn keine Antwort auf einen Hörer, wird Node.js es als Ausnahme zu verwenden, um das Programm mit einer Fehlermeldung beenden.

So streben wir im allgemeinen Einstellungen Fehler Ereignis-Listener auslöst, vermeiden wird der Fehler in den Programmabstürze auftreten. Zum Beispiel:

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

Führen Sie die folgende Fehlermeldung angezeigt:

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) 

Inheritance EventEmitter

Die meisten der Zeit, die wir nicht direkt verwenden EventEmitter, aber es in dem Objekt geerbt. Einschließlich fs, net, http, einschließlich, solange die Unterstützung Incident-Response-Kernmodule Subklassen von EventEmitter sind.

Warum? Es gibt zwei Gründe:

Zunächst wird das Objekt die Funktionalität einer physischen Realisierung von Ereignissen aufweist, die den Emissionsmonitor und Semantik zu erfüllen, sollte das Ereignis ein Objekt sein.

Zweitens ist das Objekt Mechanismus JavaScript ein Prototyp-basierte, mehrteilige Unterstützung Vererbung, Objekte EventEmitter nicht das ursprüngliche Erbe stören.