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連接。
Redis的客戶端是一個[EventEmitter(http://nodejs.org/api/events.html#events_class_events_eventemitter),它有一個'on'方法,它只是'addListener'的別名,和'removeListener',這是它的反義詞。所以你可以繼續使用'on',同時仍然使用'removeListener'。 – 2012-07-24 14:03:46
對於像我這樣只是剔除了這一點而錯過了一點的人:removeListener實際上是刪除了FUNCTION,而不僅僅是清除綁定。 'removeListener('message',callback)'從'message'綁定中刪除'callback'函數。這意味着如果您使用的是匿名函數'redis1.addListener('message',function(c,m){..}',那麼您無法刪除偵聽器,並且redis將繼續發佈到死亡套接字 – TheRightChoyce 2013-08-13 20:18:15
@ Thechoyce您的評論給了我比答案更多的信息! – laike9m 2014-09-07 17:14:57