2016-06-02 2 views
1

웹 소켓 구현을 위해 ws 모듈을 사용하고 있습니다.emit을 한 번만 호출하면 사용자 정의 이벤트가 여러 번 발생합니다.

newmessage이라는 이벤트가 web-socket-server로 열린 소켓 수와 같습니다. 나는 이유를 이해할 수 없었다. 디버깅에서 방출이 한 번만 발생했지만 이벤트 함수가 두 번 호출되는 것을 발견했습니다.

'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; 

은 무엇 이것에 대한 이유가 될 수있다 : 여기

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(); 
    }); 
}); 

SocketServer 기능입니다? newsocket 이벤트가 한 번만 발생하고 newmessage 이벤트가 발생하면이 문제가 발생합니다 ( SocketServer).

답변

1

EventEmitter.on()을 호출 할 때마다 다른 수신기가 추가됩니다. 당신이 당신의 사건을 방출 할 때, 그들은 모두 한꺼번에 발사합니다.

이벤트 리스너가 이미 있는지 확인하고 다시 수신하지 않도록 할 수 있습니다.

관련 문제