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ą.
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'. –
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
@ Thechoyce Twój komentarz daje mi więcej informacji niż odpowiedź! – laike9m