2016-04-30 6 views
0

ルームを動的に作成する(フロントエンドからのリクエストに基づいて)。私はthis gistに続いた。io.sockets.in(roomName).on(myEvent)は参加後に動作しません

私は特定の部屋でイベントを聴き、部屋の他のメンバーにブロードキャストします。なぜ次のコードがそれをしていないのか分かりません。特に、2番目のログステートメントが決して起こらないのはなぜですか。私のコメントパー

io.sockets.on('connection', function (socket) { 
    socket.on('joinRoom', function (roomName) { 
    socket.join(roomName, function() { 
     console.log('joined ' + roomName); // logs properly 
     io.sockets.in(roomName).on('setVideoOnServer', function (inputUrl) { 
     console.log('setVideoOnServer: ', inputUrl); // not hitting here 
     io.sockets.in(roomName).emit('setVideoOnClient', inputUrl); // broadcast instead 
     }); 
    }); 
    }); 
}); 
+0

「io.sockets.in(roomName).on(...)」という構造体はどうなっていると思いますか? – jfriend00

+0

@ jfriend00 "ねえ、あなたの部屋はすべてソケットに入っています - このイベントを聞いて、これをやってください" –

+0

私はそうではないと思います。 'io.sockets.in()'は 'eventEmitter'から派生した' Namespace'オブジェクトを返します。名前空間オブジェクトに '.on()'のオーバーライドはありません。だから、あなたがしていることは、名前空間オブジェクト自体にリスナーを追加することです。そして、たとえそれがあなたが思ったことを行ったとしても、新しいソケットがその部屋に加わるたびに重複イベントハンドラを追加することになります。これもまた問題になります。 – jfriend00

答えて

1

、私はio.sockets.in(roomName).on(...)あなたはそれがない何を考えていないと思います。

io.sockets.in()は、eventEmitterから派生したNamespaceオブジェクトを返します。名前空間オブジェクトに.on()のオーバーライドはありません。だからあなたがしているのは、指定されたソケットまたはソケットグループではなく、名前空間オブジェクト自体にリスナーを追加することです(socket.ioコードを見れば分かります) 。

名前空間オブジェクトに.emit()のオーバーライドがあります。その理由はio.sockets.in(xxx).emit(...)です。それはあなたが重複したイベントハンドラに新しいソケットはまた、おそらくだろうその部屋に参加したすべての時間を加算することだろう、と思った何をした場合でも、https://github.com/socketio/socket.io/blob/master/lib/namespace.js

そして:

FYI、名前空間のオブジェクトのためのコードはここにあります誰かが新しい部屋に入るたびに、既に部屋にあるすべてのソケットのイベントリスナーを再追加することになるので問題です。

私はあなたがこれで欲しいものを達成することができると思う:

io.sockets.on('connection', function (socket) { 
    socket.on('joinRoom', function (roomName) { 
    socket.join(roomName, function() { 
     console.log('joined ' + roomName); // logs properly 
     socket.on('setVideoOnServer', function (inputUrl) { 
     console.log('setVideoOnServer: ', inputUrl); // not hitting here 
     io.sockets.in(roomName).emit('setVideoOnClient', inputUrl); // broadcast instead 
     }); 
    }); 
    }); 
}); 

ソケットが部屋に参加するたび、それはsetVideoOnServerイベントのために登録されます。だから、部屋のすべてのソケットはそのイベントのために登録されます。

注:あなたがこれまで複数の部屋にソケットに参加している場合は、これはあなたがいるのは、それぞれにsetVideoOnClientをブロードキャストする、setVideoOnServerイベントに対して複数のリスナーを設定しますので、あなたが望むものをやっていることを確認する必要があります他のすべてのソケット。

この部屋を出る場合は、イベントリスナーも削除する必要があります。

関連する問題