2015-12-04 24 views

回答

0

我通過在連接上設置currentRoomId變量來解決我的問題,所以我可以在斷開連接時訪問它。

io.sockets.on('connection', function(socket) { 
    var currentRoomId; 
    socket.on('join', function(roomId) { 
     socket.join(roomId); 
     currentRoomId = roomId; 
    }); 

    socket.on('disconnect', function() { 
    socket.broadcast.in(currentRoomId).emit('user:left', socket.id); 
    }); 
} 
+0

有一個改進的答案,這不存儲房間ID添加到一個變量。請參閱下面的答案。 – Garre

0

您可以在開始時跟蹤全局聲明數組中的所有套接字,然後在斷開事件中檢查該數組的索引。事情是這樣的:

var allClients = []; 

io.sockets.on('connection', function(socket) { 
    allClients.push(socket); 

    socket.on('disconnect', function() { 
     // this is your leaving Socket object 
     var index = allClients.indexOf(socket); 
     var leaving_socket = allClients[index]; 

     // this is the way to get the rooms in 1.3.7 
     console.log(leaving_socket.rooms); 
    } 
} 

您可以檢查出的文檔here

編輯

leaving_socket.rooms是的,當然,數組而不是字符串,因爲一個單一的插座可以在許多房間一次。這意味着你將不得不遍歷該數組並找到你正在尋找的那個。套接字也總是位於與套接字的ID具有相同名稱的房間中。

+0

不幸的是,leaving_socket.rooms是空的... – Tib

0

客房於「斷開連接」事件已經離開,使用「斷開」事件發生磨片的房間仍然入店之前,將要發射的「斷開」事件。

它的工作原理是這樣的:

socket.on('disconnecting', function(){ 
    var self = this; 
    var rooms = Object.keys(self.rooms); 

    rooms.forEach(function(room){ 
     self.to(room).emit('user left', self.id + 'left'); 
    }); 
}); 
相關問題