So entfernen Sie Redis auf "message", Listener
Einem typischen Redis-chat-Beispiel wird etwa so gehen (siehe https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js für nur ein Beispiel):
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();
});
});
Jedoch, das Problem hier ist, dass, wenn ein client
'trennen', die redis1.on('message',FUNC(){})
Hörer ist noch befestigt. Die Konsole wird weiterhin drucken Sie die message
. Wenn man untersuchen den Fall listners von redis1
würde, würden Sie immer noch die anonyme Funktion hören.
Das Problem ist, dass es keine redis1.off(...)
Funktion. Also, wie stellt man das trennen/Abmelden/löschen/entfernen Sie die redis message listener?
Hinweis: Man kann nicht nur tun, redis1.Ende(), da brechen die redis-Verbindung für andere websocket verbundenen Benutzer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einzige Lösung, die ich gefunden habe durch Herumspielen in der node REPL ist nicht zu verwenden, die
redis.on()
- Funktion zu abonnieren. Stattdessen sollte man dieredis.addListener()
undredis.removeListener()
Funktionen. Darüber hinaus darf man nicht verwenden, anonyme Funktionen als Ereignis-callbacks.Könnte man etwas wie das hier tun:
on
Methode, die ist nur ein alias füraddListener
, undremoveListener
, die es gegenüber. So können Sie halten miton
, während immer noch mitremoveListener
.removeListener('message', callback)
ist das entfernen des 'callback' - Funktion aus der Nachricht 'message' verbindlich. Das heißt, wenn Sie eine anonyme Funktionredis1.addListener('message', function(c,m){ .. }
, dann haben Sie keine Möglichkeit, das entfernen der listener und redis wird auch weiterhin veröffentlichen zu Toten sockel