2016-05-17 7 views
0

は、これは私の関数である:これはsocket.ioで有効ですか?

io.on('connection', function (socket) { 
      socket.on('checkcrn', function (msg) { 
       socket.on('error', function(err){ 
        console.log("err + " + err); 
       }) 
       console.log("message " + msg); 
      }); 
     }); 

私は同じソケットを呼び出しますが、別のイベントで別のイベントにされてやろうとしています。これも可能ですか、何か間違っていますか?ここで

答えて

1

はあなたのコードを模倣するスタンドアロンバージョンです:あなたがいることを実行する場合

const EventEmitter = require('events').EventEmitter; 

let socket = new EventEmitter(); 

socket.on('checkcrn', function (msg) { 
    socket.on('error', function(err){ 
    console.log("err + " + err); 
    }) 
    console.log("message " + msg); 
}); 

socket.emit('checkcrn', 'hello world #1'); 
socket.emit('checkcrn', 'hello world #2'); 
socket.emit('error', 'error #1'); 

、あなたはerr + error #1が2回記録されていることがわかります。さらに悪いことに、より多くのメッセージをcheckcrnに送信した場合、送信したメッセージごとに余分なエラーメッセージが表示されます。これは、checkcrnメッセージごとに新しいerrorリスナーを追加したためです。

あなたはcheckcrnリスナーと同じレベルにerrorリスナーの宣言を移動することによって、その問題を解決することができます

io.on('connection', function (socket) { 

    socket.on('checkcrn', function (msg) { 
    console.log("message " + msg); 
    }); 

    socket.on('error', function(err){ 
    console.log("err + " + err); 
    }); 

}); 

それはまだあなたがにリスナーをアタッチしている同じsocketです。

+1

を行うことによって追跡このイベントのバインドを解除でき、彼は* 'ERROR'を取得したいですクライアントが既に 'checkcrn'を送信した後にのみ* **です。しかし、あなたは正しいのです。このようなことは、それがそのままではいけません。エラーリスナーを起動するかどうかを判断するには、ソケットレベルの変数を用意するのが良いでしょう。 –

+0

@AndreyPopovうーん、私は誤解しているかもしれません。 – robertklep

+0

これは間接的に私の問題を解決しました:) – abedzantout

0

これはそのままメモリリークを実証する良い例です。割り当てることで

イベントリスナー本当に悪いです、あなたが(後でそれらを削除せずに)キャッチされているすべての新しいイベントで新しいハンドラを作成イベントリスナーの内部

リスナーを同じレベルに保ち、すべてが正常になります。 FYI

場合、あなたはイベントのいくつかの種類を追跡する必要はありません、あなたは、単に私の知る限り理解できるようsocket.removeListener('eventname', functionReference)

関連する問題