socket.on事件每次响应都会重复一次以上

我已经设置socket.emit事件成功cooment。 但是,当我绑定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"); }); 

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

PS套接字连接已经build立。 那没问题。

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

所以我对之前的代码做了如下修改

  $(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事件每次响应都会重复一次以上"

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

 $(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处理程序时,都会将其他事件侦听器附加到套接字。 您在之前的点击中附加的听众保持活跃状态​​。

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

例如,你点击某个东西来调用ajax() 。 并在成功socket.on('refresh')得到执行。 所以现在,如果用户在button上多次点击,那么Ajax会被多次调用。 这导致在sockets()上重复sockets()

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

你的问题解决了:)

每当一个ajax请求成功的时候,你就在socket.on refresh函数中附加了匿名函数的另一个副本。

我做了这个testing。 如果我单击ajaxbutton,然后单击“单击我”button,我会在控制台中得到一个“你好”。 如果我再次单击ajaxbutton,然后单击“单击我”,我会得到两个“你好”。 再次点击ajax,“点击我”打印三次“howdy”等。

 <!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> 

编辑:所以解决scheme,如果你的目标是简单地为socket.on refresh事件设置一些行为,就是将这种行为分配到ajax函数以外的任何可能被多次调用的函数之外。