Socket.io: socket.roomsは役に立たないオブジェクトです

作成日 2017年03月08日  ·  8コメント  ·  ソース: socketio/socket.io

これは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を使用しています。

最も参考になるコメント

ええ、これは不必要に複雑に思えます。 ユーザーのソケットIDが「部屋」である理由、またはキーと値のペアが必要な理由を理解するのに本当に苦労しています。 それはただリストである必要があります-どんな部屋が存在していても、あなたは入っていて、完了しています。

['room1', 'room2', 'room3']

上記のように、io.roomsは、文字列配列として、またはこの場合は部屋名をキーとして、ソケットIDの配列を値として持つオブジェクトとして、それらすべてを取得します。

{ room1: ['id1', 'id2', 'id3'], room2: ['id4', 'id5', 'id6'] }

全てのコメント8件

さて、ここのドキュメントは最新ではないようです。 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がセットになり、基になるアダプターによって提供される値を使用します。ここを参照して

このページは役に立ちましたか?
0 / 5 - 0 評価