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)
からの収益は何ですか?
@ Mad-Headドキュメントによると、連鎖性を維持するために、他のすべてのメソッドとほぼ同じソケットインスタンスを返します。
http://socket.io/docs/server-api/#socket #to(room:string):socket
面白いのは、これが真実であるということです
console.log(transport === socket.broadcast.to(room));
やあ! socket.broadcast
実際に一時フラグ(つまり、 broadcast
)を追加します。このフラグは、次にsocket
emit
が呼び出されたときに使用されます。
フラグは最初に使用され、その後削除されるため、2回目の呼び出しの結果になります。
やあ! うーん...多分私は十分に明確ではなかった。 もっとはっきりさせておきましょう。
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);
したがって、フラグに関連するものではありません。 上記の2つのサンプルは同じように機能するはずですが、そうではありません。 それが問題で、私はその理由を理解するために1日半ほど壁にぶつかっています。
UPD:実際には@darrachequesneあなたは正しいです。 私はソースを調べました:emit()が呼び出されるたびに_roomsがフラッシュされ、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の提案に感謝します。
これを閉じる
最も参考になるコメント
やあ!
socket.broadcast
実際に一時フラグ(つまり、broadcast
)を追加します。このフラグは、次にsocket
emit
が呼び出されたときに使用されます。フラグは最初に使用され、その後削除されるため、2回目の呼び出しの結果になります。