3

私は 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 が内側のリスナーを削除しないことです。そのため、別のユーザーが部屋から出た後に別のユーザーが入室すると、そのユーザーはアラートを受け取ります。

これを行う別の方法は、リスナーを屋外に配置することですが、複数の部屋を管理するのは困難です。

ありがとう。

4

1 に答える 1

6

あなたがすでに問題を解決していることは知っていますが、何が起こっているのかを人々に知ってもらうために、とにかく答えます。

1) removeAllListeners() は、問題のイベントのコールバックの配列のみを削除します。他のイベントにはまったく影響しません。

eventListener (つまり、on('xyz', function(){}) を定義するときは、提供されたイベントの名前でインデックス付けされた配列にコールバック関数を追加します。この配列は、問題のオブジェクトのメンバーです。 「webSocket」オブジェクト webSocket.on("createRoom", function(){}) は、次のようなオブジェクトに関数を追加します

webSocket.listeners = {
    "createRoom: [ function ],
    "someOtherEvent": [ function, function, function ]
}

webSocket.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 ]
}

これら 2 つのイベントが別のイベントのコールバック内で定義されているからといって、その「親」イベントに関連付けられているわけではありません。お気づきのように、これらのリスナーを削除する唯一の方法は、明示的に削除することです。

$('#exitButton').on('click', function() {
    // Removes
    websocket.removeAllListeners('createRoom');
    websocket.removeAllListeners('main/roomJoin');
    websocket.removeAllListeners('chat/messageReceived');
});
于 2012-09-17T20:10:38.873 に答える