2016-06-02 9 views
1

Ich verwende das Modul ws, um Web-Sockets zu implementieren.Benutzerdefiniertes Ereignis wird mehrfach ausgelöst, wenn emit nur einmal aufgerufen wird

Das Ereignis mit dem Namen newmessage wird ausgelöst, gleich der Anzahl der Sockets, die mit dem Web-Socket-Server geöffnet werden. Ich konnte den Grund nicht verstehen. Obwohl ich beim Debuggen festgestellt habe, dass die Ausgabe nur einmal ausgelöst wird, wird die Ereignisfunktion zweimal aufgerufen. Hier

var SocketServer = require("./lib/SocketServer"); 

// Creating the object starts the server on this.socketPort 
var sserver = new SocketServer(webSocketPort); 
// Calling activateListeners on SocketServer instance, activates 
// all the event listeners associated with SocketServer 
sserver.activateListeners(); 
sserver.on("newsocket",function(socket,status) { 
    infoLogger.setMessage(`New socket opened: ${socket}`).log(); 
    sserver.on("newmessage",function(message,status) { 
     // BEING CALLED = NUMBER OF SOCKETS OPENED 
     infoLogger.setMessage(`New message received: ${message}`).log(); 
    }); 
}); 

ist die SocketServer Funktion:

'use strict'; 

var WebSocketServer = require("ws").Server 
    , EventEmitter = require("events").EventEmitter 
    , util = require("util") 
    , Logger = require("./Logger"); 


function SocketServer(port) { 
    this.socketPort = port; 
    // Starts WebSocket Server 
    this.socketServer = new WebSocketServer({port: this.socketPort}); 
    var logger = new Logger(`Socket server started on ${this.socketPort}`,0).log(); 
} 

util.inherits(SocketServer,WebSocketServer); 

SocketServer.prototype.activateListeners = function() { 
    var that = this; 
    this.socketServer.on("connection",function(socket) { 
     that.emit("newsocket",socket,200); 
     socket.on("message",function(message) { 
      that.emit("newmessage",message,200); 
     }); 
    }); 
}; 

// Exports 
module.exports = SocketServer; 

Was ist der Grund dafür sein könnte? newsocket Ereignis wird nur einmal ausgelöst und das Problem tritt nur mit newmessage Ereignis ausgelöst von SocketServer.

Antwort

1

Jedes Mal, wenn Sie EventEmitter.on() aufrufen, wird ein weiterer Listener hinzugefügt. Wenn Sie Ihr Ereignis ausstrahlen, feuern sie alle gleichzeitig.

Sie können einige Überprüfungen vornehmen, um festzustellen, ob der Ereignis-Listener bereits vorhanden ist, und es vermeiden, ihn erneut hinzuzufügen, wenn dies der Fall ist.

Verwandte Themen