2013-06-12 40 views
8

Socket.io dường như đang kích hoạt nhiều thông điệp theo cấp số nhân, dưới đây là ví dụ tôi đang chạy gây ra sự cố.Socket.io kích hoạt nhiều sự kiện

phía Chủ đầu tư:

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

Server side:

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

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

Đối với một số lý do mỗi khi nút được click các sự kiện bị sa thải nhiều lần, tăng theo cấp số nhân. Tôi đã cố gắng xác định những gì heck đang xảy ra nhưng không may mắn gỡ lỗi nó hoặc tìm kiếm trực tuyến.

Trả lời

24

Mỗi lần trình xử lý nhấp chuột được gọi, nó sẽ thêm trình xử lý sự kiện bổ sung vào socket. Các trình lắng nghe bạn đính kèm trên các nhấp chuột trước đó vẫn hoạt động. Bạn cần bắt đầu sử dụng removeListener hoặc removeAllListeners để xóa người nghe cũ hoặc bạn cần di chuyển mã người nghe bên ngoài trình xử lý nhấp chuột để nó không được gọi nhiều lần.

Ví dụ:

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

Cảm ơn bạn! Tôi đã không nhận ra rằng socket.io sẽ nối các callback như thế, bây giờ tôi có cấu trúc theo cách bạn đã làm nó! –

+1

@JosephShering, Nó không phải là socket.io cụ thể. Đó là cách hầu hết các hệ thống sự kiện hoạt động. Tôi rất vui vì nó đã hoạt động. Nếu bạn hài lòng với câu trả lời của tôi, vui lòng đánh dấu câu trả lời là đã được chấp nhận. –

Các vấn đề liên quan