8

Socket.io は指数関数的に複数のメッセージを起動しているようです。これは、問題を引き起こす実行中の例です。

クライアント側:

<html>
<head>
<script type="text/javascript" src="../../js/jquery191.min.js"></script>
<script type="text/javascript" src="http://192.168.1.2:8887/socket.io/socket.io.js"></script>
</head>

<body>

<button>Click Me!</button>

<script type="text/javascript">
$(document).ready(function(){
var socket = io.connect('http://192.168.1.2:8887');

$("button").click(function(){

    console.log("Emitting test_parent");
    socket.emit('test_parent');

    socket.on('test_parent_server', function(data){
        console.log("Handling test_parent_server");


        console.log("Emitting test_child");
        socket.emit('test_child');

        socket.on('test_child_server', function(ing){
            console.log("Handling test_child_server");

        });

    });
});
});
</script>
</body>
</html>

サーバ側:

socket.on("test_parent", function(){
    socket.emit("test_parent_server", { data : " " });
});

socket.on("test_child", function(){
    socket.emit("test_child_server", { data : " " });
});

何らかの理由で、ボタンがクリックされるたびに、イベントが複数回発生し、指数関数的に増加します。一体何が起こっているのかを特定しようとしましたが、デバッグしたりオンラインで検索したりすることはできませんでした。

4

1 に答える 1

24

クリック ハンドラーが呼び出されるたびに、追加のイベント リスナーがソケットにアタッチされます。前のクリックでアタッチしたリスナーはアクティブなままです。removeListenerまたはremoveAllListenersを使用して古いリスナーを削除するか、複数回呼び出されないようにリスナー コードをクリック ハンドラーの外に移動する必要があります。

例えば:

$("button").click(function() {
    console.log("Emitting test_parent");
    socket.emit('test_parent');
});

socket.on('test_parent_server', function(data) {
    console.log("Handling test_parent_server");

    console.log("Emitting test_child");
    socket.emit('test_child');
});

socket.on('test_child_server', function(ing) {
    console.log("Handling test_child_server");
});
于 2013-06-12T04:13:12.497 に答える