Jquery 递归删除多个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(

我正在用node.js和socket.io编写一个应用程序,用户可以在个人聊天室中相互交谈。每个人都可以有多个打开的聊天室。当用户想要退出聊天室时,系统必须删除聊天室中的每个套接字侦听器

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');
});

我终于手动删除了所有的侦听器。如果您已经解决了问题,请将您是如何解决的作为一个答案发布出来。