2017-05-06 11 views
0

私はノードを使い始めています。私はHTTPサーバーとsocket.ioを使用しています。すべては期待どおりに動作しますが、ソケットに放出するボタンがあり、10回クリックすると、イベントのメモリリークが検出され、setMaxListenersにログに関する警告が表示されます。これまでのところ私は他の質問を見ましたが、私はリスナーを削除しなければなりませんでしたが、Max Listenerを増やすのではなく、成功していませんでした。サーバー側ではクリックで発光した後にリスナーを削除する - Socket.ioのアドバイスとノード

$(document).ready(function() {    
     $("#validate").click(function() { 
      socket.emit('stop', "validate button"); 
     }); 
    }); 

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

    // WE RECEIVE stop 
    socket.on('stop', function (msg) { 
     console.log(msg);    
     clearInterval(refresh); 
    }); 
}); 

がどのように私はイベント後にリスナーを削除することができます

私のクライアント側のコードは次のようになりますか?

どのようなライトが高く評価されます。事前のおかげで

答えて

1

だけあなたはjQueryのを使用しているので、あなたはこのように、one()機能を使用することができ、一度クライアント側のイベントを発射する:サーバー側で

$(document).ready(function() {  
     $("#validate").one('click', function() { 
       socket.emit('stop', "validate button"); 
     }); 
    }); 

、これを試してみてください。

io.sockets.on('connection', function (socket) { 
    // WE RECEIVE stop 
    socket.on('stop', stopHandler); 

    function stopHandler (msg) { 
     console.log(msg); 
     clearInterval(refresh); 
     socket.removeListener('stop', stopHandler); 
    } 
}); 
+0

クイック返信ありがとうございますが、クリックを1回実行に制限します.2回目にクリックすると、ソケットには送信されず、リスナーはイベントにとにかく追加し続けると思います。 – Aramil

+0

私は今あなたの問題をよく理解していると思っています。私の答えに行った更新を見てください。 – rdgd

+0

もう一度、リスナーを削除しますが、ボタンはもう機能しません。つまり、達成したいのは、各クリックでリスナーを追加し続けるのを避け、メモリリークメッセージを避けることです。リスナーが10回クリックするとmaxListenersに関する警告が表示されますが、サーバー上でメモリが増えても表示されませんが、その警告は表示されません。私はそれがソケットに放出することが可能である場合、リスナーを削除し、新しい要求を待って、次に新しいリスナーが追加され、放出し、その後、削除することが可能ですか? – Aramil

関連する問題