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

标签 javascript socket.io

我有一个项目,当用户登录时,它会在 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/

相关文章:

javascript - JQuery - 有条件地迭代元素以 addClass()

javascript - 如何将 SAFEARRAY(字节数组)放入 HTML 隐藏字段

javascript - xmlhttprequest 请求已发送,但代码未执行?

node.js - 从 WebOS 连接到 node.js/Socket.io 服务器

android - 如何将移动发起的视频通话与基于网络的 [node.js] 视频通话集成?

javascript - Node - 无法将键/值附加到对象

javascript - 管理 splitterSide 以将其用作可重用组件

javascript - socket.io - 向特定用户广播

javascript - 如何防止使用Socket.io滚动类似事件? - Angular 7

javascript - 避免 HTML 和脚本标签渲染