لقد لاحظت هذا السلوك الغريب أثناء البث إلى عملاء آخرين باستخدام socket.broadcast.emit()
إليك نموذج التعليمات البرمجية للمشكلة:
...notifyOtherClients = function(room, e, data, socket)
{
// sending to all clients in a room except sender
var transport = socket.broadcast.to(room);
//
setTimeout(function(){
// #method1: this works as expected: all clients receive event except the sender
socket.broadcast.to(room).emit(e, data);
// #method2: this doesn't work though: all clients receive this event. Why?! Bug?
transport.emit(e, data);
// logs out 'true'
console.log(transport === socket.broadcast.to(room));
},
1000);
};
...
notifyOtherClients("myRoom", "someEvent", { }, socket);
ما الذي افتقده هنا؟ لماذا # method2 لا تعمل كما هو متوقع.
شكرا.
ما الذي يتم إرجاعه من socket.broadcast.to(room)
؟
@ Mad-Head وفقًا للمستندات ، يتم إرجاع نفس مثيل مأخذ التوصيل تقريبًا مثل كل الطرق الأخرى للحفاظ على قابلية التسلسل.
http://socket.io/docs/server-api/#socket #to (room: string): socket
الشيء المضحك هو أن هذا أثر صحيح
console.log(transport === socket.broadcast.to(room));
أهلا! socket.broadcast
بإضافة علامة مؤقتة (أي broadcast
) والتي سيتم استخدامها في المرة القادمة التي يتم فيها استدعاء emit
على socket
.
يتم استخدام العلم في المرة الأولى ، ثم يتم حذفه ، ومن هنا جاءت نتيجة مكالمتك الثانية.
أهلا! حسنًا ... ربما لم أكن واضحًا بما فيه الكفاية. اسمحوا لي أن أوضحها أكثر:
عينة 1
setTimeout(function(){
// #method1: this works as expected: all clients receive event except the sender
socket.broadcast.to(room).emit(e, data);
},
1000);
عينة 2
var transport = socket.broadcast.to(room);
setTimeout(function(){
// #method2: this doesn't work though: all clients receive this event. Why?! Bug?
transport.emit(e, data);
},
1000);
لذلك فهي لا تتعلق بالعلم. يجب أن تعمل العيّنتان أعلاه بنفس الطريقة ، لكنهما لا يعملان. هذه هي المشكلة ولقد كنت أقوم بضرب الحائط لمدة 1/2 في اليوم لمعرفة السبب.
محدث: في الواقع darrachequesne أنت على حق. لقد بحثت في المصدر: يُطلق على كل مرة ينبعث فيها () _ تم مسح الغرف وتحدث المشكلة الغريبة ، بينما كان setTimeout لا يزال قيد التقدم ، هناك طريقة أخرى تسمى emit () وتنظيف الغرفة (كانت ping هي المشكلة)
هذا ما حدث
1. setup a room with to()
2. start timeout for 1000 ms
...
[some where between 0 and 1000 ms] ping occurs i.e. emit() and flushes the room
...
3. timeout calls socket but the room's already flushed.
4. *problemo* all clients get notified including the sender socket.
شكرا جزيلا لاقتراحكdarrachequesne.
إغلاق هذا
التعليق الأكثر فائدة
أهلا!
socket.broadcast
بإضافة علامة مؤقتة (أيbroadcast
) والتي سيتم استخدامها في المرة القادمة التي يتم فيها استدعاءemit
علىsocket
.يتم استخدام العلم في المرة الأولى ، ثم يتم حذفه ، ومن هنا جاءت نتيجة مكالمتك الثانية.