Socket.io: 送信者の問題を除くすべてのクライアントへのブロードキャスト

作成日 2016年06月22日  ·  4コメント  ·  ソース: socketio/socket.io

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実際に一時フラグ(つまり、 broadcast )を追加します。このフラグは、次にsocket emitが呼び出されたときに使用されます。

フラグは最初に使用され、その後削除されるため、2回目の呼び出しの結果になります。

全てのコメント4件

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の提案に感謝します。
これを閉じる

このページは役に立ちましたか?
0 / 5 - 0 評価