2015-10-15 66 views
5

我已经在成功通过时设置了socket.emit事件。但是,当我绑定sockets.on事件时发生问题。它被多次解雇。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'); 
        //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.Socket连接已经建立。那没问题。

编辑:我纠正了错误。如果有人在将来阅读此内容。 正如jason和Niranjan所提到的,socket.on{}事件在成功回应时自我约束。 简单: 每次调用click处理程序时,都会将其他事件侦听器附加到套接字。您在之前的点击中附加的听众会保持活动状态。

,所以我做了以下修改WRT之前的代码

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

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

     } 
    }); 
}); 

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

编码愉快。

+0

您是否将函数的多个副本绑定到'socket.on''refresh'事件? – Jason

+0

你什么时候调用ajax函数? –

+0

不仅console.log('刷新'); –

回答

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。{}事件在成功响应时自动绑定。到 很简单:每次调用点击处理程序时,它都会将 附加事件侦听器附加到套接字。您之前点击上附加的 的听众会保持活动状态。

1

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

我做了这个测试。如果我点击ajax按钮,然后点击“click me”按钮,我会在控制台中看到一个“howdy”。如果我再次单击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.onrefresh事件,是分配该行为在ajax函数之外以及可能被多次调用的任何函数之外。

+0

那么我将如何避免在socket.on刷新函数中附加匿名函数的另一个副本,这样我就不会多次使用howdy? @jason –

2

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

例如,您在点击某物时致电ajax()。并在成功socket.on('refresh')得到执行。所以现在,如果用户在按钮上多次点击,ajax将被多次调用。这导致在sockets()

重复所以请确保您不要多次调用ajax。

您的问题已解决:)

相关问题