これはsocket.roomsオブジェクトに関するもので、
このクライアントが存在する部屋を識別する文字列のハッシュ。部屋名でインデックスが付けられます。
それが何を意味するのかわかりませんが、例は明らかです。
io.on('connection', function(socket){
socket.join('room 237', function(){
console.log(socket.rooms); // [ <socket.id>, 'room 237' ]
io.to('room 237', 'a new user has joined the room'); // broadcast to everyone in the room
});
});
console.log(socket.rooms);
を実行すると、そのきれいな配列が_必要_になります(スライスできるように)
io.on('connection', function(socket){
socket.join('room 237', function(){
console.log(socket.rooms); // { <socket.id>: '<socket.id>', 'room 237': 'room 237' }
});
});
...次に、 .keys()
配列に変換してから、 socket.id
を手動で選択する必要があります(最初ではない可能性があるため)。
これはバグですか? 1.7.3を使用しています。
さて、ここのドキュメントは最新ではないようです。 rooms
は、v1.4までは実際には配列だったと思います。
注:値としてブール値を使用できると思います。
それなら、これは機能リクエストだと思います。 socket.ioを再び素晴らしいものにしましょう:アレイを復活させましょう!
ここでの私の目標は、クライアントがいる部屋の配列を取得することです。配列を使用すると、 socket.id
が最初になると想定します。
var rooms = socket.rooms.slice(1);
現在の実装の使用:
var roomKeys = Object.keys(socket.rooms);
var socketIdIndex = roomKeys.indexOf( socket.id );
var rooms = roomKeys.splice( socketIdIndex, 1 );
socket.id
が含まれていなければ、それも問題ありません。 私はそれを見つけて選ぶ必要はありません。
var rooms = Object.keys(socket.rooms);
ブール値を使用すると、次のように真の値を除外できます(右?):
var roomKeys = Object.keys(socket.rooms);
var rooms = roomKeys.filter(function(key){
return socket.rooms[key]==true;
});
これは、 indexOf()
繰り返すのと同じくらい遅いです。
クライアントが参加していない部屋を含めると便利です(参加できるチャットルームを表示するなど)。 Server
インスタンスのように、他の場所では情報が優れていると思います。
var allRooms = io.rooms;
var myRooms = socket.rooms;
他の誰かがこれについて意見を持っていますか?
ええ、これは不必要に複雑に思えます。 ユーザーのソケットIDが「部屋」である理由、またはキーと値のペアが必要な理由を理解するのに本当に苦労しています。 それはただリストである必要があります-どんな部屋が存在していても、あなたは入っていて、完了しています。
['room1', 'room2', 'room3']
上記のように、io.roomsは、文字列配列として、またはこの場合は部屋名をキーとして、ソケットIDの配列を値として持つオブジェクトとして、それらすべてを取得します。
{
room1: ['id1', 'id2', 'id3'],
room2: ['id4', 'id5', 'id6']
}
主な理由はルックアップのパフォーマンスだと思います。
たとえば、ユーザーが100の部屋に参加した場合、配列値を繰り返すよりも、オブジェクトルックアップを使用してユーザーが部屋に参加したかどうかを確認する方が高速です。
stackoverflowに関する私の回答を参照してください
{
"room1":"room1",
"room2":"room2",
...
"room100":"room100"
}
ユーザーが部屋に参加したかどうかを確認するには、次のようにします。
if(socket.rooms[roomID]) return true;
配列型の場合は、indexOfを使用するか、すべての配列を反復処理する必要があります。
if(socket.rooms.indexOf(roomID) != -1) return true;
しかし、キー値がブール値に変更された場合、私は完全に同意します。
{ room1: true, ... , room100: true }
メモリ使用量の節約に役立つ場合があります
値がブール値になるようにsocket.roomsを変更してもかまいません。 これに取り組んでも大丈夫ですか? CONTRIBUTING.mdファイルが表示されなかったため、貢献プロセスが何であるかわかりません。
Set
方が理にかなっているのではないでしょうか?
if (socket.rooms.has(roomID)) return true;
構造は、たとえば単純にSet(4) {"<socket ID>", "room1", "room2", "room3"}
になります。
セットの時間計算量が一定である限り、私は同意します。 私はJavaScriptを信じています。
Socket.IO v3では、 Socket#rooms
がセットになり、基になるアダプターによって提供される値を使用します。ここを参照して
最も参考になるコメント
ええ、これは不必要に複雑に思えます。 ユーザーのソケットIDが「部屋」である理由、またはキーと値のペアが必要な理由を理解するのに本当に苦労しています。 それはただリストである必要があります-どんな部屋が存在していても、あなたは入っていて、完了しています。
['room1', 'room2', 'room3']
上記のように、io.roomsは、文字列配列として、またはこの場合は部屋名をキーとして、ソケットIDの配列を値として持つオブジェクトとして、それらすべてを取得します。
{ room1: ['id1', 'id2', 'id3'], room2: ['id4', 'id5', 'id6'] }