Socket.io: как правильно входить и выходить из комнат
Я пытаюсь изучить Socket.io, создавая набор динамически создаваемых чатов, которые выдают «подключенные» и «отключенные» сообщения, когда пользователи входят и выходят. Посмотрев напара из вопросы Я собрал что-то функциональное, но большая часть ответов связана с людьми, которые признают, что они взломали вместе ответы, и я заметил, что есть более общая - и недавняя - дискуссия о правильном способе сделать это на Socket.io репо (особенноВот а такжеВот)
Поскольку я такой новичок, я не знаю, является ли работа, представленная ниже, приемлемым способом выполнения каких-либо действий, или это просто происходит случайно, но вызывает проблемы с производительностью или приводит к слишком большому количеству слушателей. Если есть идеальный - и официальный - способ присоединиться и покинуть комнаты, которые кажутся менее неуклюжими, чем этот, я бы хотел узнать об этом.
клиент
var roomId = ChatRoomData._id // comes from a factory
function init() {
// Make sure the Socket is connected
if (!Socket.socket) {
Socket.connect();
}
// Sends roomId to server
Socket.on('connect', function() {
Socket.emit('room', roomId);
});
// Remove the event listener when the controller instance is destroyed
$scope.$on('$destroy', function () {
Socket.removeListener('connect');
});
}
init();
сервер
io.sockets.once('connection', function(socket){
socket.on('room', function(room){ // take room variable from client side
socket.join(room) // and join it
io.sockets.in(room).emit('message', { // Emits a status message to the connect room when a socket client is connected
type: 'status',
text: 'Is now connected',
created: Date.now(),
username: socket.request.user.username
});
socket.on('disconnect', function () { // Emits a status message to the connected room when a socket client is disconnected
io.sockets.in(room).emit({
type: 'status',
text: 'disconnected',
created: Date.now(),
username: socket.request.user.username
});
})
});