Socket.io: البث لجميع العملاء باستثناء مشكلة المرسل

تم إنشاؤها على ٢٢ يونيو ٢٠١٦  ·  4تعليقات  ·  مصدر: socketio/socket.io

لقد لاحظت هذا السلوك الغريب أثناء البث إلى عملاء آخرين باستخدام 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 بإضافة علامة مؤقتة (أي broadcast ) والتي سيتم استخدامها في المرة القادمة التي يتم فيها استدعاء emit على socket .

يتم استخدام العلم في المرة الأولى ، ثم يتم حذفه ، ومن هنا جاءت نتيجة مكالمتك الثانية.

ال 4 كومينتر

ما الذي يتم إرجاعه من 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.
إغلاق هذا

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