Un tipico Redis Chat esempio andrà qualcosa di simile (vedi https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js per solo un esempio):Come rimuovere Redis sugli ascoltatori 'messaggio'
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();
});
});
Tuttavia, il problema qui è che quando un client
' disconnect ', il listener redis1.on('message',FUNC(){})
è ancora collegato. La console continuerà a stampare il numero message
. Se si dovessero ispezionare i listener di eventi di redis1
, troverebbero comunque la funzione anonima in ascolto.
Il problema è che non esiste la funzione redis1.off(...)
. Quindi, come si fa a non vincolare/annullare l'iscrizione/eliminare/rimuovere l'ascoltatore del messaggio redis?
Nota: non è possibile eseguire semplicemente redis1.end(), poiché ciò interromperà la connessione redis per altri utenti connessi a Websocket.
Il cliente Redis è un [EventEmitter] (http://nodejs.org/api/events.html#events_class_events_eventemitter), che ha un metodo 'on' che è solo un alias per 'addListener' e' removeListener', che è il contrario. Quindi puoi continuare a usare 'on', mentre usi ancora' removeListener'. –
Per chi come me ha appena sfiorato questo e perso il punto: il removeListener sta effettivamente rimuovendo la FUNZIONE, non solo cancellando quella rilegatura .. I.E. 'removeListener ('message', callback)' sta rimuovendo la funzione 'callback' dal binding 'message'. Significato se stai usando una funzione anonima 'redis1.addListener ('messaggio', funzione (c, m) {..}', allora non hai modo di rimuovere l'ascoltatore e i redis continueranno a pubblicare nelle prese morte – TheRightChoyce
@ Thechoyce Il tuo commento mi dà più informazioni rispetto alla risposta! – laike9m