Jquery 递归删除多个socket.io侦听器
我正在用node.js和socket.io编写一个应用程序,用户可以在个人聊天室中相互交谈。每个人都可以有多个打开的聊天室。当用户想要退出聊天室时,系统必须删除聊天室中的每个套接字侦听器Jquery 递归删除多个socket.io侦听器,jquery,node.js,socket.io,listener,Jquery,Node.js,Socket.io,Listener,我正在用node.js和socket.io编写一个应用程序,用户可以在个人聊天室中相互交谈。每个人都可以有多个打开的聊天室。当用户想要退出聊天室时,系统必须删除聊天室中的每个套接字侦听器 websocket.on('createRoom', function(roomID) { ... var room = generateRoom(); ... // Leaving room $('#exitButton').on('click', function(
websocket.on('createRoom', function(roomID) {
...
var room = generateRoom();
...
// Leaving room
$('#exitButton').on('click', function() {
// Removes
websocket.removeAllListeners('createRoom');
});
// User joins the room
websocket.on('main/roomJoin/'+roomID, function(username) {
alert(username + ' has joined the room');
});
...
websocket.on('chat/messageReceived/'+roomID, function(message) {
room.printMessage(message);
});
});
问题是removeAllListeners不会删除内部侦听器,因此如果其他用户在其他用户退出后进入房间,他会收到警报
另一种方法是将听众放在室外,但管理多个房间会更困难
谢谢。我知道你已经解决了这个问题,但我还是会回答的,这样人们就会知道发生了什么 1) removeAllListeners()仅移除相关事件的回调数组;它完全不影响任何其他事件 定义eventListener(即on('xyz',function(){})时,将回调函数附加到按提供的事件名称索引的数组中。此数组是相关对象的一个成员,在您的示例中是“webSocket”对象。webSocket.on(“createRoom”,function(){})将函数添加到与
webSocket.listeners = {
"createRoom: [ function ],
"someOtherEvent": [ function, function, function ]
}
removeAllListeners('createRoom')只需从对象中删除createRoom键及其关联值,而不会影响任何其他事件:
webSocket.listeners = { "someOtherEvent": [ function, function, function ] }
2) 尽管roomJoin和messageReceived事件是在createRoom事件的回调函数中定义的,但它们仍在webSocket对象的同一实例上运行。因此,您将得到一个类似于以下内容的侦听器对象:
webSocket.listeners = {
"createRoom: [ function ],
"main/roomJoin: [ function ],
"chat/messageReceived": [ function ]
}
结合上面第1点的信息,webSocket.removeAllListeners(“createRoom”)将产生以下结果:
webSocket.listeners = {
"main/roomJoin: [ function ],
"chat/messageReceived": [ function ]
}
仅仅因为这两个事件是在另一个事件的回调中定义的,并不意味着它们无论如何都与该“父”事件关联。正如您现在所了解的,删除这些侦听器的唯一方法是显式删除它们:
$('#exitButton').on('click', function() {
// Removes
websocket.removeAllListeners('createRoom');
websocket.removeAllListeners('main/roomJoin');
websocket.removeAllListeners('chat/messageReceived');
});
我终于手动删除了所有的侦听器。如果您已经解决了问题,请将您是如何解决的作为一个答案发布出来。