2013-06-12 104 views
8

Socket.io似乎以指數形式觸發多個消息,下面是我正在運行的導致此問題的示例。Socket.io觸發多個事件

客戶端:

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

對於每一個點擊按鈕的事件被解僱多次,成倍增加的時間有些道理的。我試圖找出發生了什麼,但沒有運氣調試它或在線搜索。

回答

24

每次調用click處理程序時,都會將其他事件偵聽器附加到套接字。您在之前的點擊中附加的聽衆會保持活動狀態。您或者需要開始使用removeListenerremoveAllListeners來刪除舊的偵聽器,或者您需要將偵聽器代碼移到點擊處理程序以外,以便它不會被多次調用。

例如:

$("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"); 
}); 
+0

謝謝!我沒有意識到,socket.io會連接這樣的回調,現在我已經像結構一樣工作了! –

+1

@JosephShering,它不是socket.io特定的。這是大多數事件系統的工作原理。我很高興它的工作。如果您對我的回答滿意,請將其標記爲已接受。 –