我有一个项目,当用户登录时,它会在 map 上绘制标记。 但是,在用户注销后,标记仍然保留。
我正在尝试编写一个断开连接函数来销毁该标记。 但它不起作用。
我需要什么客户端吗?
服务器端
// 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];
});
});
最佳答案
我猜markers
是一个数组,因为你使用push
。因此删除标记[socket.id]
无法正常工作。您必须搜索它 - 迭代所有项目,检查 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
}
}
关于javascript - Socket.io 在断开连接时删除标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30510113/