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

时间:2015-02-27 20:36:24

标签: 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
    });

});

myServiceEventEmitter的单例和子类,随着时间的推移会触发myevent。一切正常,但我猜我在这种情况下会造成某种泄漏。我的服务如何知道一旦连接被销毁就不需要调用处理程序?我可以捕获某种类型的销毁事件,然后从myService删除处理程序吗?

2 个答案:

答案 0 :(得分:0)

监听套接字断开连接事件,当您收到断开连接事件时,从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()来广播到所有套接字而不是为此目的处理连接或断开事件。

答案 1 :(得分:0)

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

将socket.io事件简单地发送到现在使用io.sockets连接的所有套接字(这是对默认命名空间的引用,默认情况下包含所有客户端),效率更高,也更容易和io.sockets.emit

myService.on('myevent', () => {
  io.sockets.emit('myevent', {/*...*/});
});

如果您只需要将此事件发送给用户的某个子集,请尝试使用特定的namespaces or rooms

myService.on('myevent', () => {

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

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

});