2013-06-12 3 views
8

सॉकेट.ओओ कई संदेशों को तेजी से फायरिंग प्रतीत होता है, यहां एक उदाहरण है जो मैं चल रहा हूं जो इस मुद्दे का कारण बनता है।सॉकेट.यो कई घटनाओं को फायरिंग

क्लाइंट साइड:

<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

हर बार क्लिक हैंडलर कहलाता है, यह अतिरिक्त घटना श्रोताओं को सॉकेट में जोड़ता है। पिछले क्लिक पर संलग्न श्रोताओं को सक्रिय बना रहता है। पुराने श्रोताओं को हटाने के लिए आपको या तो 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"); 
}); 
+0

धन्यवाद! मुझे एहसास नहीं हुआ कि सॉकेट.ओओ इस तरह के कॉलबैक को जोड़ देगा, अब मेरे पास संरचना है जिस तरह से आपने काम किया है! –

+1

@ जोसेफ शेरिंग, यह socket.io विशिष्ट नहीं है। यह है कि अधिकांश घटना प्रणाली कैसे काम करते हैं। मुझे खुशी है कि यह काम किया। अगर आप मेरे उत्तर से खुश हैं, तो कृपया इसे स्वीकार के रूप में चिह्नित करें। –

संबंधित मुद्दे