2012-07-23 52 views
14

典型Redis的聊天例子會是這樣刪除的Redis(見https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js只是這樣一個例子):如何在「消息」聽衆

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(...)函數。那麼,如何解除/取消訂閱/刪除/刪除redis消息偵聽器?

注意:不能只是做redis1.end(),因爲這會打破其他websocket連接用戶的redis連接。

回答

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',這是它的反義詞。所以你可以繼續使用'on',同時仍然使用'removeListener'。 – 2012-07-24 14:03:46

+13

對於像我這樣只是剔除了這一點而錯過了一點的人:removeListener實際上是刪除了FUNCTION,而不僅僅是清除綁定。 'removeListener('message',callback)'從'message'綁定中刪除'callback'函數。這意味着如果您使用的是匿名函數'redis1.addListener('message',function(c,m){..}',那麼您無法刪除偵聽器,並且redis將繼續發佈到死亡套接字 – TheRightChoyce 2013-08-13 20:18:15

+0

@ Thechoyce您的評論給了我比答案更多的信息! – laike9m 2014-09-07 17:14:57