2017-07-04 2 views
0

Ich habe eine Frage zu events.EventEmitter in Node.js, warum verwenden Sie es? Was ist der Unterschied zu Beispiel 1 und Beispiel 2? Ich finde sie identisch, oder? Wann ist es praktisch, es zu benutzen?Node.js, EventEmitter warum es zu verwenden

let events = require("events"); 
let util = require("util"); 
let eventEmitter = new events.EventEmitter(); 

Beispiel 1 mit den EventEmitter:

let Student = function(name) { 
    this.name = name; 
} 

util.inherits(Student, events.EventEmitter); 

let student_max = new Student('max'); 

student_max.on('scored', function(points) { 
    if (points > 90) { 
     points = points + ' wow you scored more than 90' 
    } 
    console.log(`${this.name} ${points} points`); 
}) 

student_max.emit('scored',95); 

Beispiel 2 ohne EventEmitter

let Student2 = function(name) { 
    this.name = name; 
    this.score = function(str,points) { 
     if (str!=='scored') { 
      return; 
     } 
     if (points > 90) { 
      points = points + ' wow you scored more than 90' 
     } 
     console.log(`${this.name} ${points} points`); 
    } 
} 

let student_lenny = new Student2('Lenny'); 

student_lenny.score('scored',95); 

Antwort

2

Das erste Beispiel ein Ereignis Emitter Unterklassen und verwendet dann dieses Ereignis Emitter einige Funktionen zu implementieren. Das bedeutet, dass jemand anderes einen Ihrer student_max Objekte nehmen und einen Ereignis-Listener für die scored Nachricht registrieren kann oder sie könnten sogar eine scored Nachricht selbst ausgeben. Sie könnten dann sehr einfach die eventEmitter-Funktionalität verwenden, um auf andere Ereignisse, die in Ihrem Objekt aufgetreten sind, zu erweitern, und dann könnte jede dritte Partei diese Ereignisse ebenfalls beobachten oder auslösen. eventEmitter ist eine standardisierte Möglichkeit, die ereignisbasierte Funktionalität zu exponieren. Sie können Dinge mit einem eventEmitter durch die Entwicklung Ihrer eigenen Benachrichtigungsschemata erreichen, aber es ist oft besser, auf einem Standardschema aufzubauen, das viele Entwickler bereits kennen und das eine ganze Menge an Funktionalität bereits eingebaut hat.

Ihr zweites Beispiel wie derzeit codiert erreicht das gleiche, ist aber nicht so erweiterbar. Zum Beispiel, wenn Sie etwas wissen wollten ein score geschieht, müssten Sie das Objekt Unterklasse und überschreiben die Score-Methode, anstatt nur einen Listener zu einem Ereignis mit der etablierten eventEmitter Schnittstelle hinzufügen. Wenn Sie das Objekt nicht selbst erstellt haben (was es schwierig macht, Unterklassen zu erstellen), müssen Sie die Methode score mit einem Patch versehen, um es zu beobachten.

, was der Unterschied der example1 ist

example2 Es ist ein architektonischer Unterschied, dass wirkt es sowohl auf wie außerhalb Agenten interagieren mit diesen Objekten und wie dehnbar sie in der Zukunft.

Die Verwendung der eventEmitter in Beispiel1 ist sehr erweiterbar und erleichtert das Hinzufügen zukünftiger Ereignisse zum Objekt mithilfe der Funktionen eventEmitter oder für externe Agenten zum Überwachen oder Auslösen von Ereignissen mithilfe einer standardisierten Schnittstelle. So ist der Unterschied nicht genau in dem Code, was Sie achieves zeigen, sondern wie es architected ist und somit, wie erweiterbar es in der Zukunft oder wie außerhalb Code sein würde, mit Ihrem Objekt interagieren könnte

Wenn es praktisch ist, um es zu benutzen?

Sie ein eventEmitter Objekt so ziemlich jede Zeit denken würde, über die Verwendung von möchten Sie außerhalb Parteien in der Lage sein, Ereignisse oder Trigger-Ereignisse in einem leichten und einfachen Weg, auf dem Objekt zu beobachten. Es ist ein vorgefertigtes System dafür und ist oft besser, als ein eigenes Callback-Benachrichtigungsschema zu erfinden. Und manchmal ist es sogar für Ihre eigene Implementierung nützlich, wenn Sie nicht versuchen, externe Interaktionen zu aktivieren.

+0

Danke +++++ perfekt erklärt. – DavidInu071

+0

@ DavidInu071 - Da es so aussieht, als ob Sie hier neu sein könnten, können Sie dies der Community anzeigen, indem Sie auf das grüne Häkchen links neben der Frage klicken.Das bringt dir auch einige Reputationspunkte für das richtige Vorgehen und mehr Reputationspunkte werden dir später mehr Privilegien einbringen. – jfriend00

+0

Das stimmt, ich bin neu hier, ich kann kein grünes Häkchen auf meiner Frage finden. Das einzige, was ich sehe, ist der upvotes/downvotes () und ein Lieblingsstart darin. – DavidInu071

Verwandte Themen