Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 断开Socket.IO客户端连接时释放事件处理程序_Javascript_Node.js_Socket.io - Fatal编程技术网

Javascript 断开Socket.IO客户端连接时释放事件处理程序

Javascript 断开Socket.IO客户端连接时释放事件处理程序,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我使用的Socket.IO与此示例类似: io.sockets.on("connection", function (socket) { myService.on("myevent", function() { socket.emit("myevent", { /* ... */ }); // some stuff happens here of course }); }); myService是EventEmitter的一个单例和子类,它在

我使用的Socket.IO与此示例类似:

io.sockets.on("connection", function (socket) {

    myService.on("myevent", function() {
        socket.emit("myevent", { /* ... */ });
        // some stuff happens here of course
    });

});

myService
EventEmitter
的一个单例和子类,它在一段时间内触发
myevent
。一切正常,但我想我在这种情况下造成了某种泄漏。我的服务如何知道一旦连接被破坏就不需要调用处理程序?是否存在某种销毁事件,我可以捕获并从
myService
中删除处理程序?

侦听套接字断开连接事件,当您收到断开连接事件时,从
myService
对象中删除相关的事件处理程序

您应该能够这样做:

io.sockets.on("connection", function (socket) {

    function handler() {
        socket.emit("myevent", { /* ... */ });
        // some stuff happens here of course
    }

    myService.on("myevent", handler);

    socket.on("disconnect", function() {
        myService.removeListener("myevent", handler);
    });

});

如果您试图对所有连接的套接字进行广播,那么只需安装一个“myevent”侦听器(不是每个连接一个)并使用
io.emit()
也可以广播到所有套接字,而不必为此处理连接或断开连接事件。

如果您计划在触发其他事件时向所有套接字发送数据,则无需在每次客户端连接/断开连接时添加/删除其他侦听器

使用(默认情况下,这是对默认名称空间的引用,所有客户端都在该名称空间上)和以下命令将socket.io事件简单地触发到当前连接的所有套接字,这样会更加高效和容易:

如果您只需要向部分用户触发此事件,请尝试使用特定的:


尚不清楚什么是
myService
,它的生命周期是什么,或者它与套接字的关系如何
myService
是单身什么?您可以监视
断开连接
事件并在那里执行操作。正如我的问题
myService
中提到的,它是一个单例。单例什么?它是什么类型的物体?它有什么作用?它有什么方法?它与插座有什么关系?单身只意味着他们只有一个。它没有告诉我们它是什么类型的对象,它的用途是什么,以及如何使用它?你在这里只透露了大约1/3的相关问题。是的,如果套接字连接,然后断开连接,并且相关的myService事件处理程序没有被删除,那么这里确实会出现内存泄漏。您的
myService.on()
事件处理程序将保留对
套接字的关闭引用,即使它早就关闭了。我们必须知道myService是什么,以及如何从中删除事件处理程序,才能知道建议什么。@jfried00:这是一个广义的问题,所以不需要知道它的用途或它是什么类型的对象。当谈到单例时,我指的是一个对象,它被实例化一次,然后在整个流程生命周期中保存,并在所有需要它的地方重用。谢谢。就这样。我错过的部分是
断开
事件。但是我的问题不清楚,我很抱歉并感谢您的帮助。@miho-我添加了一个代码示例,现在我知道
myService
是一个
EventEmitter
。谢谢。只是一些小的修正,它不是
removeEventListener
。当您只想向所有客户机广播消息时,向单个套接字添加/删除侦听器不是一个好的做法。检查我的答案,寻找更有效、更干净的解决方案。@Diegonnes-你对OP的情况做了一些假设,但问题中没有说明。也许是这样,也许不是。他们询问如何在套接字断开连接时删除事件侦听器,因此我向他们展示了如何正确地执行该操作。因此,你否决了我。哎呀。如果你的答案更好,它应该得到更多的选票。你不需要仅仅因为你认为你有更好的方法就否决一个正确的答案。如果OP提供了关于整个问题的更多背景,我们可能都可以在总体方案中提供更有用的答案。
myService.on('myevent', () => {
  io.sockets.emit('myevent', {/*...*/});
});
myService.on('myevent', () => {

  //with namespaces
  io.of('namespace').emit('myevent', {/*...*/});

  //with rooms
  io.to('room').emit('myevent', {/*...*/});

});