Jak usunąć Redis na' message'

Typowy przykład czatu Redis pójdzie coś takiego (zobacz https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js{[8]tylko jeden taki przykład):

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();
  });
});

Problem polega jednak na tym, że gdy client 'rozłączyć', redis1.on('message',FUNC(){}) słuchacz jest nadal dołączony. Konsola będzie nadal drukować message. Gdyby ktoś sprawdzał listę zdarzeń redis1, nadal znajdowałby funkcję Anonymous nasłuchującą.

Problem polega na tym, że nie ma redis1.off(...) funkcji. W jaki sposób można odłączyć/anulować subskrypcję/usunąć / usunąć słuchacza wiadomości redis?

Uwaga: nie można po prostu zrobić redis1.end (), ponieważ spowoduje to przerwanie połączenia redis dla innych użytkowników podłączonych do websocket.

Author: hrdwdmrbl, 2012-07-23

1 answers

Jedynym rozwiązaniem, które znalazłem, bawiąc się w REPL węzła jest nie używać funkcji redis.on() do subskrybowania. Zamiast tego należy użyć funkcji redis.addListener() i redis.removeListener(). Ponadto nie wolno używać funkcji anonimowych jako wywołań zwrotnych zdarzeń. Można by zrobić coś takiego:

var callback = function(channel, message){

};

redis1.addListener('message', callback);

client.on('disconnect', function(){
  redis1.removeListener('message', callback);    
})
 26
Author: hrdwdmrbl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-23 17:53:50