2015-05-28 3 views
0

У меня есть проект, который отображает маркеры на карте, когда пользователь входит в систему. однако маркеры остаются после выхода пользователя из системы.Socket.io Удаление маркера при отключении

Я пытаюсь написать функцию разъединения, чтобы уничтожить только этот маркер. но не работает.

Нужна ли мне клиентская сторона?

SERVER SIDE

// Socket markers start 

io.on('connection', function(socket) { 

socket.on('marker', function(data) { 
    data.socketId = socket.id; 
    User.findById(socket.request.session.passport.user, function(err, user){ 
    if(user){ 
     data.socketId = socket.id; 
     data.user = user; 
     markers.push(data); 
     console.log(markers); 
     // markers[socket.id] = data; 

     io.emit('show-marker', markers); 
    } 
    }); 
}); 
// socket.on('show-marker',) 
socket.on('show-user-location', function(data) { 
    io.emit('show-user-location', data); 
}); 

socket.on('disconnect', function(){ 
    console.log(socket.name + ' has disconnected from the chat.' + socket.id); 
    delete markers[socket.id]; 
}); 


}); 
+0

Как на стороне клиента должен знать удалить маркер? Не следует ли снова выпустить событие «show-marker» из обновленного списка маркеров после удаления с помощью 'delete markers [socket.id]'? –

ответ

2

Я думаю markers является массивом, так как вы используете push. Таким образом, delete markers[socket.id] не работает должным образом. Вы должны найти его - перебрать все элементы, проверить, совпадает ли идентификатор, а затем использовать splice.

Так что лучше использовать Object для хранения маркеров, как:

// on connect 
markers[data.id] = data; 

// on disconnect 
delete markers[socket.id] 

Если вы все еще хотите использовать массив, это будет работать для вас:

// on disconnect 
for (var i = 0; i < markers.length; i++) { // loop through all markers 
    if (socket.id == markers[i].id) { // find the one you need 
     markers.splice(i, 1); // remove it from array 
     break; // stop searching - already found it 
    } 
} 
+0

Да, правильный массив ... , поэтому нам нужно удалить правильный маркер, проверив? socket.on ('disconnect', function() { для (i = 0; i <(markers.length- 1); i ++) { if (socket.id ===) { удалить маркеры [сокет .id] } } – Stacca

+0

Обновлен мой ответ, чтобы включить использование массива. –

Смежные вопросы