在客户端断开连接时释放事件处理程序 Socket.IO
Release event handlers on disconnection of Socket.IO client
我正在使用 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()
广播到所有套接字,而不必为此目的处理连接或断开连接事件。
如果您计划在触发其他事件时将数据发送到所有套接字,则无需在每次客户端连接/断开连接时添加/删除其他侦听器。
使用io.sockets(默认情况下是对默认命名空间及其上所有客户端的引用(将 socket.io 事件简单地触发到现在连接的所有套接字会更有效、更容易,io.sockets.emit
:
myService.on('myevent', () => {
io.sockets.emit('myevent', {/*...*/});
});
如果只需要向某些用户子集触发此事件,请尝试使用特定的命名空间或聊天室:
myService.on('myevent', () => {
//with namespaces
io.of('namespace').emit('myevent', {/*...*/});
//with rooms
io.to('room').emit('myevent', {/*...*/});
});
相关文章:
- keyup事件处理程序更改焦点不适用于快速键入
- 提示使用服务器端事件处理程序激活JavaScript
- 将事件处理程序绑定到任何可能的事件
- 正在将事件处理程序添加到不存在的类
- 在循环中附加事件处理程序时出现浏览器性能问题
- 在同一个javascript事件处理程序中调用不同的函数
- 有没有一种方法可以让内联事件处理程序在元素创建后立即执行
- 检查事件处理程序参数
- 实现延迟的jquery更改事件处理程序
- 如何使用Node.js在JavaScript模块文件之间使用事件处理程序
- 如何使jQuery的“bind”或“on”事件处理程序幂等
- 带有参数的Javascript事件处理程序
- Jquery事件处理程序仅适用于匿名函数
- 如何从另一个处理程序内部取消JavaScript事件处理程序函数的执行
- 如何在jQuery事件处理程序中存储和重用超时
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 异步处理所有事件处理程序的方法
- jsplumb中的Click事件处理程序丢失“;这个“;对象
- 构造函数中的事件处理程序与构造函数外的事件处理函数的行为不同
- 如何在事件处理程序的回调中防止Default