2015-10-15 9 views
5

के साथ एक से अधिक बार दोहरा रहा है मैंने सफल कॉमेंट पर socket.emit ईवेंट सेट किया है। लेकिन समस्या तब होती है जब मैं sockets.on घटना को बांधता हूं। इसे कई बार निकाल दिया जा रहा है।सॉकेट.ऑन इवेंट प्रत्येक प्रतिक्रिया

$(document).on('click', '#comment_button', function() { 
    $.ajax({ 
     // upon success 
     success: function (response) { 

      if (response) { 
       socket.emit('postcomment'); 

       socket.on('refresh', function() { 
        console.log('refresh'); 
        //This console.log('refresh') is coming multiple times. I mean its occurance increases with every successful ajax response. 
       }); 
     } 
    }); 
}); 

यहाँ मेरी server.js

socket.on('postcomment', function() { 
     io.sockets.emit("refresh"); 
}); 

मैं सत्यापित किया है कि मेरी server.js में socket.on समारोह केवल एक बार के लिए कहा जाता है। मुझे यकीन नहीं है कि AJAX में socket.on('refresh', function() {} के साथ समस्या क्या है। कोई भी मदद महान होगी।

पीएस सॉकेट कनेक्शन पहले ही बना दिया गया है। उसमें कोई समस्या नहीं है।

संपादित करें: मैंने गलती को सुधार दिया। अगर कोई भविष्य में इसे पढ़ रहा है। जेसन और निरंजन ने उल्लेख किया, socket.on{} घटना सफल प्रतिक्रिया पर खुद को बाध्यकारी थी। सरल होने के लिए: हर बार क्लिक हैंडलर कहलाता है, यह अतिरिक्त घटना श्रोताओं को सॉकेट में जोड़ता है। पिछले क्लिक पर संलग्न श्रोताओं को सक्रिय बना रहता है।

तो मैं

$(document).on('click', '#comment_button', function() { 
    $.ajax({ 
     // upon success 
     success: function (response) { 

      if (response) { 
       socket.emit('postcomment'); 

     } 
    }); 
}); 

socket.on('refresh', function() { 
    console.log('refresh'); 
}); 

मुबारक कोडिंग पिछले कोड में निम्न परिवर्तन wrt बनाया है।

+0

क्या आप फ़ंक्शन की कई प्रतियों को 'socket.on'' refresh' ईवेंट 'पर बाध्य कर रहे हैं? – Jason

+0

जब आप AJAX फ़ंक्शन को कॉल कर रहे हैं ?? –

+0

कोई भी कंसोल.लॉग ('रीफ्रेश') नहीं; –

उत्तर

4

मैं पिछले कोड में निम्न परिवर्तन wrt बनाया है। यह काम किया।

$(document).on('click', '#comment_button', function() { 
    $.ajax({ 
     // upon success 
     success: function (response) { 

      if (response) { 
       socket.emit('postcomment'); 

     } 
    }); 
}); 

socket.on('refresh', function() { 
    console.log('refresh'); 
}); 

सॉकेट।{} घटना सफल प्रतिक्रिया पर खुद को बाध्यकारी थी। पर सरल: हर बार क्लिक हैंडलर कहलाता है, यह सॉकेट में अतिरिक्त ईवेंट श्रोताओं को जोड़ता है। पिछले क्लिक पर आपके द्वारा जुड़े श्रोताओं को सक्रिय रहता है।

1

ajax अनुरोध सफल होने पर आप socket.onrefresh फ़ंक्शन के अंदर अज्ञात फ़ंक्शन की दूसरी प्रति संलग्न कर रहे हैं।

मैंने यह परीक्षण किया। अगर मैं AJAX बटन पर क्लिक करता हूं और फिर "मुझे क्लिक करें" बटन पर क्लिक करता हूं, तो मुझे कंसोल में एक "howdy" मिलता है। अगर मैं फिर से AJAX बटन पर क्लिक करता हूं तो "मुझे क्लिक करें" पर क्लिक करें, मुझे दो बार "howdy" मिलता है। ajax फिर से क्लिक करें, "पर क्लिक करें मुझे" प्रिंट "कैसे हो" तीन बार, आदि

<!DOCTYPE html> 

<html> 
<script src="jquery-2.1.4.min.js"></script> 
<script> 

function send_ajax_request() { 
    $.ajax("http://localhost/test.html").done(function() { 
     console.log("ajax done"); 
     $("#clicker").click(function() { 
      console.log("howdy"); 
     }); 
    }); 
} 

</script> 
</head> 
<body> 

<input type="button" value="ajax request" onclick="send_ajax_request()"> 
<input type="button" value="click me" id="clicker"> 
</body> 
</html> 

संपादित करें: तो समाधान, यदि आपका लक्ष्य socket.onrefresh घटना के लिए कुछ व्यवहार स्थापित करने के लिए बस है, आवंटित करने के लिए है उस व्यवहार को ajax फ़ंक्शन के बाहर और किसी भी फ़ंक्शन के बाहर जिसे कई बार कहा जा सकता है।

+0

तो मैं सॉकेट के अंदर अज्ञात फ़ंक्शन की दूसरी प्रति संलग्न करने से कैसे बचूँगा। फ़ंक्शन रीफ्रेश करें ताकि मुझे कई बार कैसे मिल जाए? @jason –

2

मुझे क्या लगता है, सॉकेट ठीक काम कर रहे हैं। हो सकता है, ajax() कई बार बुलाया जा रहा है।

उदाहरण के लिए, आप कुछ के क्लिक पर ajax() पर कॉल कर रहे हैं। और सफलता पर socket.on('refresh') निष्पादित हो जाता है। तो अब, यदि उपयोगकर्ता बटन पर कई बार क्लिक कर रहा है, तो AJAX को कई बार बुलाया जाएगा। इससे sockets()

पर पुनरावृत्ति की ओर जाता है तो सुनिश्चित करें कि, आप कई बार AJAX को कॉल नहीं करते हैं।

आपकी समस्या हल हो जाता है :)

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