我在这个示例中使用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
删除处理程序吗?
答案 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', {/*...*/});
});