Socket.io: socket.rooms شيء عديم الفائدة

تم إنشاؤها على ٨ مارس ٢٠١٧  ·  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.

التعليق الأكثر فائدة

يا هذا يبدو معقدًا بلا داعٍ. أنا أكافح حقًا لفهم لماذا يشكل معرف مقبس المستخدم "غرفة"؟ أو لماذا نحتاج إلى أزواج مفتاح: قيمة . كل ما تحتاجه هو أن تكون قائمة - مهما كانت الغرف موجودة ، لقد انتهيت.

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

وكما ورد أعلاه ، فإن io.rooms للحصول عليها جميعًا ، إما أيضًا كمصفوفة سلسلة ، أو في هذه الحالة ككائن بأسماء الغرف كمفاتيح ومجموعة من معرّفات المقابس كقيمة لها.

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

ال 8 كومينتر

حسنًا ، يبدو أن التوثيق ليس محدثًا هنا ، rooms كان في الواقع مصفوفة حتى الإصدار 1.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;

أي شخص آخر لديه رأي حول هذا؟

يا هذا يبدو معقدًا بلا داعٍ. أنا أكافح حقًا لفهم لماذا يشكل معرف مقبس المستخدم "غرفة"؟ أو لماذا نحتاج إلى أزواج مفتاح: قيمة . كل ما تحتاجه هو أن تكون قائمة - مهما كانت الغرف موجودة ، لقد انتهيت.

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

وكما ورد أعلاه ، فإن io.rooms للحصول عليها جميعًا ، إما أيضًا كمصفوفة سلسلة ، أو في هذه الحالة ككائن بأسماء الغرف كمفاتيح ومجموعة من معرّفات المقابس كقيمة لها.

{ 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"} على سبيل المثال

أوافق على ذلك طالما أن التعقيد الزمني للمجموعة ثابت. أنا أؤمن بجافا سكريبت.

في Socket.IO v3 ، سيكون Socket#rooms الآن مجموعة ، واستخدم القيمة التي يوفرها المحول الأساسي ، انظر هنا .

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات