自定义事件被发射多次,只有一次被调用
我正在使用ws模块来实现networking套接字。
名为newmessage
的事件被触发,等于使用web-socket-server打开的套接字数量。 我不明白原因。 虽然在debugging中我发现这个发射只被触发一次,但事件函数被调用了两次。
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
函数:
'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;
这可能是什么原因? newsocket
事件只被触发一次,问题只发生在由SocketServer
触发的newmessage
事件中。
每次调用EventEmitter.on()时,都会添加另一个侦听器。 当你发射你的事件时,他们都会立刻开火。
您可以进行一些检查,以查看事件侦听器是否已经存在,并避免再次添加事件侦听器。