Socket.io在断开连接时删除标记

时间:2015-05-28 14:56:31

标签: javascript socket.io

我有一个项目,当用户登录时会在地图上绘制标记。 但是在用户退出后标记会停留。

我正在尝试编写断开连接功能来销毁该标记。 但它没有用。

我需要客户端吗?

服务器端

// 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];
});


});

1 个答案:

答案 0 :(得分:2)

我猜markers是一个数组,因为您使用的是push。因此delete markers[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
    }
}