2013-09-21 5 views
9

मैं अपने सॉकजेएस क्लाइंट के लिए सर्वर से पुनः कनेक्ट करने का तरीका समझने की कोशिश कर रहा हूं यदि इसे नीचे जाना चाहिए।सॉकजेएस क्लाइंट ऑटो रीकनेक्ट?

मैं इस समय इस राशि:

new_conn = function() {  
     socket = new SockJS(protocol + serverDomain + '/echo', null, { 
      'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 'iframe-eventsource', 'iframe-htmlfile', 'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 'jsonp-polling'] 
     }); 
    }; 

    socket.onopen = function() { 
     clearInterval(recInterval); 
    }; 

    socket.onclose = function() {  
     recInterval = window.setInterval(function() { 
      new_conn(); 
     }, 2000); 
    }; 

समस्या यह है कि setInterval एक सफल पुनः कनेक्ट होने भी फायरिंग रखता है। ऐसा लगता है कि socket.onopen कभी निष्पादित नहीं होता है।

कोई विचार क्या मैं गलत कर सकता हूं?

+2

, setTimeout() का उपयोग कर setInterval() – Fielding34

+0

@ Fielding34 वास्तव में मुझे लगता है कि यह काफी विपरीत है की तुलना में बेहतर होना चाहिए - 'setInterval()' क्योंकि ओपी रखना चाहता है बेहतर है कोशिश कर रहा है (सर्वर नीचे है) जब तक यह – TMG

उत्तर

10

मुझे लगता है कि यह परिवर्तनीय स्कॉइंग से संबंधित हो सकता है। इस प्रयास करें:

var recInterval = null; 

new_conn = function() {  
    socket = new SockJS(protocol + serverDomain + '/echo', null, { 
     'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 'iframe-eventsource', 'iframe-htmlfile', 'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 'jsonp-polling'] 
    }); 
}; 

socket.onopen = function() { 
    clearInterval(recInterval); 
}; 

socket.onclose = function() {  
    recInterval = window.setInterval(function() { 
     new_conn(); 
    }, 2000); 
}; 

भी हो, यह अजीब बात है, क्योंकि आप window वस्तु पर recInterval की घोषणा कर रहे थे, और यह काम किया जाना चाहिए था। यदि यह काम नहीं करता है, तो आप इसे स्थानीय ब्रेकपॉइंट्स सेट करके debugger; कथन या इंटरैक्टिव रूप से ब्राउज़र के साथ डीबग कर सकते हैं ... (onopen में, उदाहरण के लिए)।

वैसे, मैं इस तरह पूरे कोड rewrited (मैं पुनर्रचना की तरह :):

var recInterval = null; 
var socket = null; 

var new_conn = function() {  
    socket = new SockJS(protocol + serverDomain + '/echo', null, { 
     'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 
           'iframe-eventsource', 'iframe-htmlfile', 
           'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 
           'jsonp-polling'] 
    }); 

    socket.onopen = function() { 
     clearInterval(recInterval); 
    }; 

    socket.onclose = function() {  
     recInterval = setInterval(function() { 
      new_conn(); 
     }, 2000); 
    }; 
}; 
6

मामले किसी को अब भी इस विषय में रुचि रखते हैं: franzlorenzon से पुनर्संशोधित कोड स्निपेट के बाद से पुन: कनेक्ट हो का एक बहुत का कारण बनता है यह किसी भी तरह से दोबारा जुड़ने के बाद से किसी भी तरह की पुनरावृत्ति को फिर से कनेक्ट कर रहा है क्योंकि एक नया ऑनक्लोज़ घटना उत्पन्न होती है (रिक्त अंतराल के बावजूद)।

सॉकेट निर्माण के बाद सही अंतराल को स्थानांतरित करना चाल है। मैंने ऑनक्लोज़ इवेंट में सॉकेट = नल भी जोड़ा।

var recInterval = null; 
 
var socket = null; 
 

 
var new_conn = function() { 
 
    socket = new SockJS(protocol + serverDomain + '/echo', null, { 
 
    'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 
 
     'iframe-eventsource', 'iframe-htmlfile', 
 
     'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 
 
     'jsonp-polling' 
 
    ] 
 
    }); 
 

 
    clearInterval(recInterval); 
 

 
    socket.onopen = function() { 
 

 
    }; 
 

 
    socket.onclose = function() { 
 
    socket = null; 
 
    recInterval = setInterval(function() { 
 
     new_conn(); 
 
    }, 2000); 
 
    }; 
 
};

अपने मामले में
+1

कनेक्ट नहीं करता है इसे साझा करने के लिए धन्यवाद। बैक-ऑफ प्रोटोकॉल होना भी अच्छा हो सकता है जहां पुन: कनेक्शन प्रयासों के बीच का समय बढ़ता है। फिर, ऐप में स्क्रॉलिंग की निगरानी करके उपयोगकर्ता "निराश" होने पर पुनः कनेक्शन समय छोड़ दें। स्पष्ट रूप से वे पृष्ठ को फिर से लोड करके एक पुन: प्रयास प्रयास को ट्रिगर करेंगे। – coding

+0

@ कोडिंग हाँ आप सही हैं। उपर्युक्त कोड केवल एक उदाहरण है जो पिछले उदाहरण से त्रुटियों को हल करता है। हम आपके उत्पादन प्रणालियों पर सुझाए गए समाधान का उपयोग कर रहे हैं और यह ठीक काम करता है। इसके अलावा मैं निजी परियोजनाओं के लिए एक समान समाधान का उपयोग कर रहा हूं। कोई जटिलता भी नहीं है। :) – daPhantom

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