2013-06-12 18 views
8

Socket.io, birden çok iletiyi üstel olarak ateşliyor gibi görünüyor, burada çalışmamın bir örneği var, bu da soruna neden oluyor.Socket.io çoklu olayları tetikleme

İstemci tarafı:

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

Sunucu tarafı: nedense düğme olayları katlanarak artan birden çok kez kovulunca tıklandığında her zaman için

socket.on("test_parent", function(){ 
    socket.emit("test_parent_server", { data : " " }); 
}); 

socket.on("test_child", function(){ 
    socket.emit("test_child_server", { data : " " }); 
}); 

. Hataların ne olduğunu anlamaya çalıştım ama hata ayıklama veya çevrimiçi arama şansı yok.

cevap

24

Tıklatma işleyicisi her çağrıldığında, yuvaya ek olay dinleyicileri ekler. Önceki tıklamalar için eklediğiniz dinleyiciler etkin kalır. Eski dinleyicileri kaldırmak için removeListener veya removeAllListeners'u kullanmaya başlamanız ya da dinleyici kodunu tıklama işleyicisinin dışına taşımak için birden çok kez çağırılmaması gerekir. Örneğin

:

$("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

teşekkür ederiz! Socket.io'nun bu gibi geri çağrıları birleştireceğinin farkında değildim, şimdi yaptığınız gibi yapıya sahip olduğumu fark ettim! –

+1

@JosephShering, Bu socket.io özgü değil. Çoğu olay sistemi böyle çalışır. Çalıştığına sevindim. Cevabımdan memnunsanız, lütfen kabul edildi olarak işaretleyin. –