рдореИрдВрдиреЗ 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)
рд╕реЗ рд░рд┐рдЯрд░реНрди рдХреНрдпрд╛ рд╣реИ?
@ рдореИрдб-рд╣реЗрдб рдбреЙрдХреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдХ рд╣реА рд╕реЙрдХреЗрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рд▓рдЧрднрдЧ рд╕рднреА рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреА рддрд░рд╣ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЪреЗрдирдмрд┐рд▓рд┐рдЯреА рдмрдирд╛рдП рд░рдЦреА рдЬрд╛ рд╕рдХреЗред
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 рдХреА рддрд░рд╣ рджреАрд╡рд╛рд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рдорд╛рд░ рд░рд╣рд╛ рд╣реВрдВред
UPD: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ @darrachequesne рдЖрдк рд╕рд╣реА рд╣реИрдВред рдореИрдВрдиреЗ рд╕реНрд░реЛрдд рдореЗрдВ рджреЗрдЦрд╛ рд╣реИ: рд╣рд░ рдмрд╛рд░ рдПрдорд┐рдЯ () рдХреЛ _рд░реВрдо рдлреНрд▓рд╢ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдЬреАрдм рд╕рдорд╕реНрдпрд╛ рддрдм рд╣реБрдИ рдЬрдм рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдЕрднреА рднреА рдкреНрд░рдЧрддрд┐ рдкрд░ рдерд╛, рдЬрд┐рд╕реЗ рдПрдорд┐рдЯ () рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ рдФрд░ рдХрдорд░реЗ рдХреЛ рдлреНрд▓рд╢ рдХрд░рддрд╛ рдерд╛ (рдкрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдереА)
рдпрд╣ рдХреНрдпрд╛ рд╣реБрдЖ
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
рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрдкрд╣рд▓реА рдмрд╛рд░ рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреА рджреВрд╕рд░реА рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИред