Ich habe dieses seltsame Verhalten beim Senden an andere Clients mit socket.broadcast.emit()
bemerkt
Hier ist der Beispielcode des Problems:
...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);
Was fehlt mir hier? Warum #method2 nicht wie erwartet funktioniert.
Vielen Dank.
Was ist die Rendite von socket.broadcast.to(room)
?
@Mad-Head Gibt laut Dokumentation fast die gleiche Socket-Instanz wie alle anderen Methoden zurück, um die Verkettbarkeit beizubehalten.
http://socket.io/docs/server-api/#socket #to(room:string):socket
Das Lustige ist, dass dies wahr ist
console.log(transport === socket.broadcast.to(room));
Hi! socket.broadcast
fügt tatsächlich ein temporäres Flag hinzu (nämlich broadcast
), das beim nächsten Aufruf von emit
auf socket
.
Das Flag wird das erste Mal verwendet und dann gelöscht, daher das Ergebnis Ihres zweiten Aufrufs.
Hi! Hm... vielleicht war ich nicht klar genug. Lassen Sie es mich deutlicher machen:
Probe1
setTimeout(function(){
// #method1: this works as expected: all clients receive event except the sender
socket.broadcast.to(room).emit(e, data);
},
1000);
Probe2
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);
Es hat also nichts mit der Flagge zu tun. Die beiden obigen Beispiele sollten gleich funktionieren, tun es aber nicht. Das ist das Problem und ich habe etwa 1/2 am Tag gegen die Wand geschlagen, um herauszufinden, warum.
UPD: eigentlich @darrachequesne hast du recht. Ich habe mir die Quelle angesehen: Jedes Mal, wenn emit() aufgerufen wird, werden _rooms gespült und das seltsame Problem trat auf, als während setTimeout noch im Gange war, eine andere Methode namens emit() und spülte den Raum (Ping war das Problem)
Das ist was passiert ist
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.
Vielen Dank für Ihren Vorschlag @darrachequesne.
Diese schließen
Hilfreichster Kommentar
Hi!
socket.broadcast
fügt tatsächlich ein temporäres Flag hinzu (nämlichbroadcast
), das beim nächsten Aufruf vonemit
aufsocket
.Das Flag wird das erste Mal verwendet und dann gelöscht, daher das Ergebnis Ihres zweiten Aufrufs.