Socket.io触发多个事件

Socket.io似乎以指数forms发射多个消息,这里是我正在运行的一个例子导致的问题。

客户端:

<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 : " " }); }); 

由于某种原因,每次点击button时,事件会被多次触发,呈指数级增长。 我试图找出究竟是什么,但没有运气debugging或在线search。

每次调用click处理程序时,都会将其他事件侦听器附加到套接字上。 您在之前的点击中附加的听众保持活跃状态​​。 您可能需要开始使用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"); });