Saya memperhatikan perilaku aneh ini saat menyiarkan ke klien lain menggunakan socket.broadcast.emit()
Berikut contoh kode masalahnya:
...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);
Apa yang kulewatkan di sini? Mengapa #method2 tidak berfungsi seperti yang diharapkan.
Terima kasih.
Apa pengembalian dari socket.broadcast.to(room)
?
@Mad-Head Menurut dokumen, mengembalikan instance soket yang sama hampir seperti semua metode lain untuk menjaga kemampuan rantai.
http://socket.io/docs/server-api/#socket #to(room:string):socket
Yang lucu adalah jejak ini benar
console.log(transport === socket.broadcast.to(room));
Hai! socket.broadcast
sebenarnya menambahkan flag sementara (yaitu, broadcast
) yang akan digunakan saat berikutnya emit
dipanggil pada socket
.
Bendera digunakan pertama kali, dan kemudian dihapus, oleh karena itu hasil dari panggilan kedua Anda.
Hai, yang di sana! Hm... mungkin saya kurang jelas. Biarkan saya membuatnya lebih jelas:
sampel1
setTimeout(function(){
// #method1: this works as expected: all clients receive event except the sender
socket.broadcast.to(room).emit(e, data);
},
1000);
sampel2
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);
Jadi tidak terkait bendera. Kedua sampel di atas seharusnya berfungsi sama, tetapi tidak. Itulah masalahnya dan saya telah memukul dinding selama 1/2 hari untuk mencari tahu mengapa.
UPD: sebenarnya @darrachequesne Anda benar. Saya telah melihat ke sumbernya: setiap kali emit() disebut _rooms di-flush dan masalah aneh terjadi ketika setTimeout masih dalam proses, metode lain yang disebut emit() dan membersihkan ruangan (ping adalah masalahnya)
itulah yang terjadi
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.
Terima kasih banyak atas saran Anda @darrachequesne.
Menutup yang ini
Komentar yang paling membantu
Hai!
socket.broadcast
sebenarnya menambahkan flag sementara (yaitu,broadcast
) yang akan digunakan saat berikutnyaemit
dipanggil padasocket
.Bendera digunakan pertama kali, dan kemudian dihapus, oleh karena itu hasil dari panggilan kedua Anda.