2012-07-23 21 views
14

「メッセージ」のリスナーにRedisのを削除する方法(ワン例えばhttps://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.jsを参照してください):典型的なRedisのはこのような何かを行く例をチャット

io.sockets.on('connection', function (client) { //websocket connection 

    redis1.subscribe("chat"); 

    redis1.on("message", function(channel, message) { 
     console.log(message); 
     client.send(message); 
    }); 

    client.on('message', function(msg) { 
    redis2.publish("chat",msg.message); 
    }); 

    client.on('disconnect', function() { 
     redis1.quit(); 
    }); 
}); 

しかし、ここで問題があるというときclient " 「切断」すると、リスナーはまだ添付されています(redis1.on('message',FUNC(){}))。コンソールは引き続きmessageを印刷します。 redis1のイベントリストを調べる場合、彼らは依然として匿名機能のリスニングを見つけるでしょう。

問題は、redis1.off(...)機能がないということです。では、どのようにして、赤いメッセージのリスナーをアンバインド/サブスクリプション/削除/削除するのですか?

注:redis1.end()を実行するだけでは、他のWebソケット接続されたユーザーの再接続が切断されることはありません。

答えて

21

ノードREPLで遊んで見つけた唯一の解決策は、redis.on()関数を使用してサブスクライブすることです。代わりに、redis.addListener()redis.removeListener()関数を使用する必要があります。さらに、イベントコールバックとして匿名関数を使用してはいけません。 一つは、このような何かを行うことができます:

var callback = function(channel, message){ 

}; 

redis1.addListener('message', callback); 

client.on('disconnect', function(){ 
    redis1.removeListener('message', callback);  
}) 
+4

Redisのクライアントである[持つEventEmitter](http://nodejs.org/api/events.html#events_class_events_eventemitter)、 'on'の方法を持っているこれはただであります'addListener'のエイリアスと' removeListener'という逆のことです。したがって、 'removeListener'を使っている間も、' on'を使い続けることができます。 –

+13

私のような、これを見逃してポイントを逃した人のために、removeListenerは実際にそのバインディングをクリアするだけでなく、FUNCTIONを削除しています。I.E. 'removeListener( 'message'、callback)'は 'message'バインディングから 'callback'関数を削除しています。つまり、匿名関数 'redis1.addListener( 'message'、function(c、m){..}}を使用している場合、リスナーを削除する方法はなく、再送信はデッドソケットにパブリッシュされ続けます – TheRightChoyce

+0

@ Thechoyceあなたのコメントは私に答えより多くの情報を与えます! – laike9m

関連する問題