1

クライアントが退室したときに、ルームに接続しているユーザーの数を送信したいと考えています。

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 );
  }
}
4

3 に答える 3

4

Socket.leaveは非同期であり、コールバック用のオプションの 2 番目のパラメーターがあるため、次のようにすることができます。

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
});

...正しい番号を報告する必要があります

これには、まだ npm に公開されていない最新バージョンの Socket.io (バージョン 1.0) が必要です (2013 年 11 月 14 日現在)。これを使用するには、package.json に以下を含める必要があります。

"dependencies": {
    "socket.io": "git://github.com/LearnBoost/socket.io.git#1.0"
}

...これは 1.0 ブランチを引き込む必要があります (警告の安定性)。

于 2013-11-14T07:28:01.410 に答える
0

このリポジトリでクライアント数を表示する作業例を確認できます。これは、socket.io v1.0 および Express v4.0 用に開発されています。

https://github.com/theoctal/livenote

于 2014-04-30T08:30:02.267 に答える
0

io.sockets.manager.roomClients[socket.id]すべての部屋名に先頭'/'文字を含む部屋のリストを返します。

Socket.io Wikiには次のように書かれています。

そのため、部屋を出るときは、部屋の名前に先頭の'/'文字が含まれていないことを確認してください。あなたが試すことができますsocket.leave(room.replace('/',''));

テストされていませんが、うまくいくはずです。

于 2013-11-14T07:41:13.817 に答える