Was ist ein "Event Emitter"?


76

Beim Durchsuchen von http://microjs.com sehe ich viele Bibliotheken mit der Bezeichnung "Ereignisemitter". Ich denke gerne, dass ich mich mit den Grundlagen der Javascript-Sprache ziemlich gut auskenne, aber ich habe wirklich keine Ahnung, was ein "Event-Emitter" ist oder tut.

Möchte mich jemand aufklären? Das klingt interessant...

Antworten:


60

Es löst ein Ereignis aus, auf das jeder hören kann. Verschiedene Bibliotheken bieten unterschiedliche Implementierungen und für unterschiedliche Zwecke an. Die Grundidee besteht jedoch darin, einen Rahmen für die Ausgabe und das Abonnieren von Ereignissen bereitzustellen.

Beispiel aus jQuery:

// Subscribe to event.
$('#foo').bind('click', function() {
    alert("Click!");
});

// Emit event.
$('#foo').trigger('click');

Mit jQuery benötigen Sie jedoch ein DOM-Objekt und können keine Ereignisse von einem beliebigen Objekt ausgeben, um ein Ereignis auszugeben. Hier wird Event-Emitter nützlich. Hier ist ein Pseudocode zum Demo von benutzerdefinierten Ereignissen (genau das gleiche Muster wie oben):

// Create custom object which "inherits" from emitter. Keyword "extend" is just a pseudo-code.
var myCustomObject = {};
extend(myCustomObject , EventEmitter);

// Subscribe to event.
myCustomObject.on("somethingHappened", function() { 
    alert("something happened!");
});

// Emit event.
myCustomObject.emit("somethingHappened");

12
Ihr letzter Absatz ist falsch, jQuery funktioniert Unterstützung benutzerdefinierte Ereignisse und Erklärungen. Beispiel: jsfiddle.net/PzRtn
Rob W

@RobW Danke für die Korrektur. Die Einschränkung von jQuery besteht jedoch darin, dass zum Ausgeben von Ereignissen ein jQuery / DOM-Objekt erforderlich ist. Ist das korrekt?
Niaher

Ich habe die Antwort korrigiert. Bitte lassen Sie mich wissen, wenn Sie noch Probleme sehen. Vielen Dank.
Niaher

4
jQuery kann Ereignisse ohne DOM-Element mit $ ({})
ausführen


21

In node.js kann ein Ereignis einfach als Zeichenfolge mit einem entsprechenden Rückruf beschrieben werden. Ein Ereignis kann mehrmals "emittiert" werden (oder mit anderen Worten, der entsprechende Rückruf wird aufgerufen), oder Sie können festlegen, dass es nur zum ersten Mal abgehört wird, wenn es emittiert wird.

Beispiel:-

var example_emitter = new (require('events').EventEmitter);
example_emitter.on("test", function () { console.log("test"); });
example_emitter.on("print", function (message) { console.log(message); });
example_emitter.emit("test");
example_emitter.emit("print", "message");
example_emitter.emit("unhandled");

> var example_emitter = new (require('events').EventEmitter);
{}
> example_emitter.on("test", function () { console.log("test"); });
{ _events: { test: [Function] } }
> example_emitter.on("print", function (message) { console.log(message); });
{ _events: { test: [Function], print: [Function] } }
> example_emitter.emit("test");
test //console.log'd
true //return value
> example_emitter.emit("print", "message");
message //console.log'd
true    //return value
> example_emitter.emit("unhandled");
false   //return value

Dies demonstriert alle grundlegenden Funktionen eines EventEmitter. Mit der on or addListenerMethode (im Grunde die Abonnementmethode) können Sie das Ereignis auswählen, auf das gewartet werden soll, und den Rückruf, der aufgerufen werden soll. Dasemit Methode (die Veröffentlichungsmethode) hingegen ermöglicht es Ihnen, ein Ereignis zu "emittieren", wodurch alle für das Ereignis registrierten Rückrufe "ausgelöst" werden (aufgerufen werden).

Aus der Quelle Was sind Ereignisemitter?


nette Erklärung des Artikels, der für mich ursprünglich keinen Sinn ergab
Vass

4

Einfaches Beispiel in Node.js:

var EventEmitter = require('events').EventEmitter;
var concert = new EventEmitter;
var singer = 'Coldplay';

concert.on('start', function (singer) {
  console.log(`OMG ${singer}!`);
});

concert.on('finish', function () {
  console.log(`It was the best concert in my life...`);
});

concert.emit('start', singer);
concert.emit('finish');

1

Betrachten Sie eine Rückruffunktion.

function test(int a, function(){
     console.log("I am call-back function");
   }){
    console.log("I am a parent function");
 }

Wenn die übergeordnete Funktion bei einem Ereignis aufgerufen wird (ein Klick auf eine Schaltfläche oder eine Verbindung usw.), führt sie zuerst ihren Code aus, und dann wird die Steuerung an die Rückruffunktion übergeben. Ein Ereignisemitter ist nun ein Objekt / eine Methode, die ein Ereignis auslöst, sobald eine Aktion ausgeführt wird, um die Steuerung an die übergeordnete Funktion zu übergeben. Zum Beispiel ist Server ein Ereignisemitter in der Node.J-Programmierung. Es gibt ein Fehlerereignis aus, sobald der Server auf einen Fehler stößt, der die Steuerung an die übergeordnete Fehlerfunktion übergibt. Der Server gibt ein Verbindungsereignis aus, sobald ein Socket mit dem Server verbunden wird. Dieses Ereignis löst dann die übergeordnete Funktion von getConnections aus, die tatsächlich auch eine Rückruffunktion als Argument verwendet. Es handelt sich also tatsächlich um eine Kette, die ausgelöst wird, wenn etwas vom Ereignisemitter passiert, der ein Ereignis ausgibt, um eine laufende Funktion zu starten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.