简体   繁体   English

当仅调用一次emit时,会多次触发自定义事件

[英]Custom event being fired multiple times when emit is called only once

I am using ws module to implement web sockets. 我正在使用ws模块来实现Web套接字。

The event named newmessage is being fired equal to the number of sockets open with the web-socket-server. 名为newmessage的事件被触发等于使用web-socket-server打开的套接字数。 I could not understand the reason. 我无法理解原因。 Although on debugging I found that the emit is fired only once, but the event function is called twice. 虽然在调试时我发现只触发了一次emit,但是事件函数被调用了两次。

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

Here is the SocketServer function: 这是SocketServer函数:

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

What could be the reason for this? 这可能是什么原因? newsocket event gets fired only once and the problem occurs only with newmessage event fired by SocketServer . newsocket事件只被触发一次,只有在SocketServer触发newmessage事件时才会出现问题。

Every time you call EventEmitter.on( ) it adds another listener. 每次调用EventEmitter.on()时,它都会添加另一个侦听器。 When you emit your event, they all fire at once. 当您发出事件时,它们会立即发射。

You can put some checks to see if the event listener already exists and avoid adding it again if it does. 您可以进行一些检查以查看事件侦听器是否已存在,并避免再次添加它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM