複数のチャット ルームをサポートできるアプリケーションがあります。クライアント側のルームに参加しているユーザーの数を更新できるように、ユーザーがブラウザーのタブを閉じたときに切断された特定のルームをキャプチャする方法を見つけようとしています。現時点では、グローバル レベルで切断をリッスンすることしかできないようです。切断イベントを取得すると、ユーザーが属するすべてのルームを経由してループし、ルーム内のユーザーio.sockets.manager.roomClients[socket.id]
数を計算して、io.sockets.clients(room).length
それを各ルームに出力できます。このユーザーが部屋を出たことを確信できない場合に、部屋の人数を再計算するのはばかげているようです。
さらに、切断イベントで、切断io.sockets.clients(room)
されたユーザーがまだアレイに表示されることに気付きました...そのユーザーがアレイに存在しなくなる前に、2 秒のタイムアウトを設定する必要があります。これは既知の問題ですか? 彼はまだショーを見せdisconnected:false
ているので、私はその物件に行くことができません.
これが私がこれまでに持っているものです:
socket.on('disconnect', function(){
//find all rooms this disconnected user belongs too
var rooms = io.sockets.manager.roomClients[socket.id];
for(var room in rooms){
room = room.replace('/','');
if(room){
//rooms tend to keep the count around for a while, needs a timeout before user is removed from room
setTimeout(function(){
socket.broadcast.to(room).emit('count', io.sockets.clients(room).length);
}, 2000);
}
}
});