Một Redis điển hình trò chuyện ví dụ sẽ đi một cái gì đó như thế này (xem https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js cho chỉ là một ví dụ như vậy):Làm thế nào để loại bỏ Redis trên người nghe 'thông báo'
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();
});
});
Tuy nhiên, vấn đề ở đây là khi một client
' ngắt kết nối ', trình nghe redis1.on('message',FUNC(){})
vẫn được đính kèm. Bảng điều khiển sẽ tiếp tục in ra số message
. Nếu một người kiểm tra người nghe sự kiện là redis1
, họ vẫn sẽ tìm thấy chức năng nghe nặc danh.
Vấn đề là không có hàm redis1.off(...)
. Vì vậy, làm thế nào để unbind/bỏ đăng ký/xóa/loại bỏ các trình nghe tin nhắn redis?
Lưu ý: Người ta không thể chỉ làm redis1.end(), vì điều đó sẽ phá vỡ kết nối redis đối với người dùng kết nối websocket khác.
Client redis là một [EventEmitter] (http://nodejs.org/api/events.html#events_class_events_eventemitter), trong đó có một 'phương pháp on' mà chỉ là một bí danh cho 'addListener' và' removeListener', điều đó ngược lại. Vì vậy, bạn có thể tiếp tục sử dụng 'on', trong khi vẫn đang sử dụng' removeListener'. –
Đối với bất cứ ai như tôi mà chỉ cần lướt qua điều này và bỏ lỡ điểm: removeListener thực sự là loại bỏ FUNCTION, không chỉ xóa thanh toán ràng buộc đó .. I.E. 'removeListener ('message', callback)' đang loại bỏ hàm 'callback' khỏi liên kết 'message'. Có nghĩa là nếu bạn đang sử dụng một hàm ẩn danh 'redis1.addListener ('message', hàm (c, m) {..}', thì bạn không có cách nào để loại bỏ trình lắng nghe và redis sẽ tiếp tục xuất bản tới các socket chết – TheRightChoyce
@ Thechoyce Cảm nhận của bạn cho tôi nhiều thông tin hơn câu trả lời! – laike9m