2012-07-23 12 views
14

Typowe Redis przykład czat pójdzie coś takiego (patrz https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js tylko dla jednego takiego przykładu):Jak usunąć Redis na słuchaczy „komunikat”

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

Jednak problem jest to, że gdy client ' disconnect ", słuchacz redis1.on('message',FUNC(){}) jest nadal podłączony. Konsola będzie kontynuować drukowanie message. Jeśli ktoś miałby przejrzeć listę uczestników wydarzenia pod numerem redis1, nadal mogliby znaleźć anonimową funkcję nasłuchującą.

Problem polega na tym, że nie ma funkcji redis1.off(...). A więc, w jaki sposób jeden odzwyczaić/wypisać/usunąć/usunąć słuchacza wiadomości redis?

Uwaga: Nie można po prostu wykonać polecenia redis1.end(), ponieważ spowoduje to przerwanie połączenia redis dla innych użytkowników połączonych z siecią.

Odpowiedz

21

Jedyne rozwiązanie, które znalazłem podczas odtwarzania w węźle REPL, to nie używać funkcji subskrypcji redis.on(). Zamiast tego należy użyć funkcji redis.addListener() i redis.removeListener(). Ponadto nie można używać funkcji anonimowych jako wywołań zwrotnych zdarzeń. Jeden mógłby zrobić coś takiego:

var callback = function(channel, message){ 

}; 

redis1.addListener('message', callback); 

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

Redis klient jest [EventEmitter] (http://nodejs.org/api/events.html#events_class_events_eventemitter), która ma 'metody on' który jest po prostu alias dla 'addListener' i' removeListener', który jest przeciwieństwem. Możesz dalej używać 'on', jednocześnie używając' removeListener'. –

+13

Dla każdego takiego jak ja, który po prostu przejrzał to i pominął punkt: removeListener faktycznie usuwa FUNKCJĘ, a nie tylko czyści to wiązanie ... I.E. 'removeListener ('message', callback)' usuwa funkcję 'callback' z powiązania 'message'. To znaczy, jeśli używasz anonimowej funkcji 'redis1.addListener ('message', function (c, m) {..}', to nie masz możliwości usunięcia słuchacza, a redis będzie kontynuował publikowanie do martwych gniazd – TheRightChoyce

+0

@ Thechoyce Twój komentarz daje mi więcej informacji niż odpowiedź! – laike9m