2015-05-28 73 views
0

我有一個在用戶登錄時在地圖上繪製標記的項目。 但是,標記在用戶註銷後停留。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]; 
}); 


}); 
+0

怎麼會知道客戶端去除標記?你不應該在用'delete markers [socket.id]'刪除後用已更新的標記列表再次發出'''show-marker''事件嗎? –

回答

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 
    } 
} 
+0

是更正數組... 所以我們需要通過檢查來刪除正確的標記嗎? (i = 0; i <(markers.length-1); i ++)if(socket.id ===){ 刪除標記[socket .id]; } } – Stacca

+0

已更新我的答案,以包含數組用法。 –

相關問題