socket.on事件每次响应都会重复多次

时间:2015-10-15 12:18:30

标签: jquery node.js sockets

我在成功合并后设置了socket.emit事件。但是当我绑定sockets.on事件时会出现问题。它被多次开除。

 $(document).on('click', '#comment_button', function() {
    $.ajax({
        // upon success
        success: function (response) {

            if (response) {
                socket.emit('postcomment');

                socket.on('refresh', function () {
                    console.log('refresh');
                  //This console.log('refresh') is coming multiple times. I mean its occurance increases with every successful ajax response.
                });
        }
    });
});

这是我的server.js

socket.on('postcomment', function () {
        io.sockets.emit("refresh");
});

我已经验证在我的server.js socket.on函数中只调用了一次。 我不确定ajax中socket.on('refresh', function () {}的问题是什么。 任何帮助都会很棒。

  

已经进行了P.S套接字连接。没问题。

     编辑:我纠正了这个错误。如果有人将来读这个。   正如杰森和尼兰詹所说,socket.on{}事件在成功回应时具有约束力。   简单来说:   每次调用单击处理程序时,它都会将其他事件侦听器附加到套接字。您在之前点击时附加的听众仍然有效。

所以我对之前的代码进行了以下更改

 $(document).on('click', '#comment_button', function() {
    $.ajax({
        // upon success
        success: function (response) {

            if (response) {
                socket.emit('postcomment');

        }
    });
});

socket.on('refresh', function () {
    console.log('refresh');
});

快乐的编码。

3 个答案:

答案 0 :(得分:4)

我对之前的代码进行了以下更改。 有效。

$(document).on('click', '#comment_button', function() {
    $.ajax({
        // upon success
        success: function (response) {

            if (response) {
                socket.emit('postcomment');

        }
    });
});

socket.on('refresh', function () {
    console.log('refresh');
});
  

socket.on {}事件在成功响应后自行绑定。至   很简单:每次调用click处理程序时,它都会附加   套接字的其他事件监听器。你附加的听众   以前的点击仍然有效。

答案 1 :(得分:2)

我觉得,插座工作正常。可能是,ajax()被多次调用。

例如,您在点击某个内容时调用了ajax()。成功socket.on('refresh')被执行。所以现在,如果用户在按钮上多次单击,则会多次调用ajax。这导致sockets()

重复

所以请确保,你不要多次调用ajax。

您的问题已解决:)

答案 2 :(得分:1)

每次socket.on请求成功时,您都会在refresh ajax函数中附加匿名函数的另一个副本。

我做了这个测试。如果我单击ajax按钮然后单击"单击我"按钮,我得到一个"你好"在控制台中。如果我再次单击ajax按钮,然后单击"单击我",我得到"你好"两次。再次点击ajax,"点击我"打印"你好"三次,等等。

<!DOCTYPE html>

<html>
<script src="jquery-2.1.4.min.js"></script>
<script>

function send_ajax_request() {
    $.ajax("http://localhost/test.html").done(function() {
        console.log("ajax done");
        $("#clicker").click(function() {
            console.log("howdy");
        });
    });
}

</script>
</head>
<body>

<input type="button" value="ajax request" onclick="send_ajax_request()">
<input type="button" value="click me" id="clicker">
</body>
</html>

编辑: 因此,如果您的目标仅仅是为socket.on refresh事件设置一些行为,那么解决方案就是将该行为分配到ajax函数之外以及任何可能的函数之外多次打电话。