He notado este comportamiento extraño al transmitir a otros clientes usando socket.broadcast.emit()
Aquí está el código de muestra del problema:
...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);
que me estoy perdiendo aqui? Por qué # method2 no funciona como se esperaba.
Gracias.
¿Qué devuelve socket.broadcast.to(room)
?
@ Mad-Head Según los documentos, devuelve la misma instancia de socket casi como todos los demás métodos para mantener la capacidad de encadenamiento.
http://socket.io/docs/server-api/#socket #to (habitación: cadena): socket
Lo curioso es que esto es cierto.
console.log(transport === socket.broadcast.to(room));
¡Hola! socket.broadcast
realidad agrega una bandera temporal (es decir, broadcast
) que se usará la próxima vez que se llame a emit
en el socket
.
La bandera se usa la primera vez y luego se elimina, de ahí el resultado de su segunda llamada.
¡Hola! Hm ... tal vez no fui lo suficientemente claro. Déjame hacerlo más obvio:
sample1
setTimeout(function(){
// #method1: this works as expected: all clients receive event except the sender
socket.broadcast.to(room).emit(e, data);
},
1000);
sample2
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);
Entonces no está relacionado con la bandera. Los dos ejemplos anteriores deberían funcionar igual, pero no es así. Ese es el problema y me he estado golpeando contra la pared durante medio día para averiguar por qué.
UPD: en realidad @darrachequesne tienes razón. He investigado la fuente: cada vez que se llama emit () _rooms se vacían y el problema extraño ocurrió mientras el setTimeout todavía estaba en progreso, otro método llamado emit () y descargó la habitación (el problema era el ping)
eso fue lo que paso
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.
Muchas gracias por tu sugerencia @darrachequesne.
Cerrando este
Comentario más útil
¡Hola!
socket.broadcast
realidad agrega una bandera temporal (es decir,broadcast
) que se usará la próxima vez que se llame aemit
en elsocket
.La bandera se usa la primera vez y luego se elimina, de ahí el resultado de su segunda llamada.