我希望在客户离开时发送连接到房间的用户数量。
似乎socket.leave()
有延迟。
如何正确地做到这一点?我不喜欢使用setTimeout()
socket.on('disconnect', function () {
var roomsToSayGoodbye = io.sockets.manager.roomClients[socket.id];
for (var room in roomsToSayGoodbye) {
io.sockets.in(room).clients().length; // For example: 6
socket.leave(room);
io.sockets.in(room).clients().length; // Still 6!!
// So, this is wrong -->
io.sockets.in(room).emit('nb-connections', { num: io.sockets.in(room).clients().length });
// <--
// and I need this to make it work, not clean! -->
setTimeout(function() {
io.sockets.in(room).clients().length; // Okay, now 5
}, 1000 );
}
}
答案 0 :(得分:4)
Socket.leave
是异步的,因此有一个可选的回调参数,所以你可以这样做:
socket.leave(room, function() {
io.sockets.in(room).emit('nb-connections', { num: io.sockets.in(room).clients().length });
// this should be the number you want
});
...应报告正确的数字
这需要最新版本的Socket.io(版本1.0)尚未发布到npm(截至2013年11月14日)。要使用它,您需要在package.json中包含以下内容:
"dependencies": {
"socket.io": "git://github.com/LearnBoost/socket.io.git#1.0"
}
...应该引入1.0分支(告诫稳定性)。
答案 1 :(得分:0)
io.sockets.manager.roomClients[socket.id]
会返回所有房间名称中带有'/'
个字符的房间列表。
Socket.io Wiki说:“这是在内部使用的,在加入,离开或向房间发射时不必引用。”
因此,当您离开房间时,请确保房间名称不包含前导'/'
字符。您可以尝试socket.leave(room.replace('/',''));
未经测试,但应该做到这一点。
答案 2 :(得分:0)
您可以查看在此存储库中显示客户端数量的工作示例。它是为socket.io v1.0和express v4.0开发的。