17

一个典型的 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 连接。

4

1 回答 1

27

我通过在节点 REPL 中玩耍找到的唯一解决方案是不使用该redis.on()功能进行订阅。相反,应该使用redis.addListener()andredis.removeListener()函数。此外,不得将匿名函数用作事件回调。可以做这样的事情:

var callback = function(channel, message){

};

redis1.addListener('message', callback);

client.on('disconnect', function(){
  redis1.removeListener('message', callback);    
})
于 2012-07-23T17:53:50.117 回答