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'); });
快乐的编码。
我对之前的代码进行了以下更改。 有效。
$(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
函数以外的任何可能被多次调用的函数之外。