2012-06-15 18 views
16

मैं वेब सेवर के लिए jquery AJAX विधि का उपयोग कर बहुत सारे डेटा भेज रहा हूं और क्लाइंट साइड केवल सर्वर से पावती प्राप्त करने के बाद प्रतिक्रिया देता है, अब मान लें कि AJAX कॉल के MIDDLE में खोए गए नेटवर्क कनेक्शन को कैसे करें इस स्थिति का पता लगाएं।नेटवर्क डिस्कनेक्ट होने के कारण अजाक्स कॉल विफलता का पता लगाने के लिए

$.ajax({ 
     url:'server.php', 
     data:'lots of data from 200KB to 5MB', 
     type:'post', 
     success: function(data) 
        { 
         alert('Success'); 
         //some stuff on success 

        }, 
      error: function(XMLHttpRequest, textStatus, errorThrown) 
        { 
         alert('Failure'); 
         //some stuff on failure 
        } 
     }); 

यह मेरा कोड है और यह इंटरनेट डिस्कनेक्ट होने पर AJAX कॉल के बीच में त्रुटि नहीं देता है।

नोट: मैं समय का उपयोग नहीं कर सकता क्योंकि डेटा आकार 200kb से 5MB तक भिन्न होता है और सर्वर प्रतिक्रिया समय गणना संभव नहीं है।

+1

'चेतावनी()' 'textStatus' और' errorThrown' और देखें कि वे विभिन्न विफलता प्रकारों के लिए कैसे बदलते हैं। आपको उपयुक्त कोड ढूंढने में सक्षम होना चाहिए। – Blender

+0

देखें http://stackoverflow.com/questions/189430/javascript-how-to-detect-that-the-internet-connection-is-offline और http://stackoverflow.com/questions/1730692/jquery-ajax -how-to-detect-network-connection-error-when-making-ajax-call – gopi1410

+0

@ जब नेटवर्क डिस्कनेक्ट हो जाता है तो ब्लेंडर तो किसी भी तर्क में कुछ भी नहीं होता है और यह त्रुटि फ़ंक्शन में नहीं जाता .. –

उत्तर

0

अपना $ .ajax ({}) बनाते समय टाइमआउट जोड़ने का प्रयास करें।

यह भी सुनिश्चित करें कि कैश सेट करें: झूठी, कभी-कभी सहायक।

jQuery के ajax() का संदर्भ लें: http://api.jquery.com/jQuery.ajax/#toptions

आप बहुत अधिक जानकारी नहीं मिल जाएगा!

आपकी समस्या [अद्यतन]

@RiteshChandora पर मेरे बारे में सोचा है, मैं आपकी चिंता यहाँ समझते हैं। मैं आपको 2 चीजें करने के लिए कैसे सुझाव दे सकता हूं।

  1. जैसा कि आपके पास 200kb से 5mb तक के पोस्ट डेटा हैं, तो आप अधिकतम टाइमआउट चुनना चाहेंगे। और इसके लिए ट्रिगर करें। हां, यह समस्याग्रस्त हो सकता है, लेकिन आपके द्वारा चुने गए डिज़ाइन के साथ, POST प्रगति की निगरानी करने का एकमात्र तरीका इस तरह से करना है। यदि नहीं, तो बिंदु 2.

  2. मैं प्रवाह के माध्यम से चला गया, आप उपयोगकर्ता को जेसन को एफबी से अपने यूआरएल में प्रतिक्रिया देने के लिए कह रहे हैं। यहां कुछ समस्याएं हैं,

  3. जेसन डेटा में उपयोगकर्ता के बारे में संवेदनशील जानकारी है, और वह इसे एसएसएल एन्क्रिप्शन के बिना यूआरएल पर पोस्ट कर रहा है।

  4. आपको उपयोगकर्ता को अपने सर्वर पर अधिग्रहित डेटा पोस्ट करने के लिए क्यों संकेत देना चाहिए? यदि आप उपयोगकर्ता को साइड स्क्रिप्ट स्क्रिप्ट करते हैं तो यह आसान होना चाहिए। साथ ही आपको कभी भी इस तरह के मौकों पर क्लाइंट से सर्वर पर भारी डेटा पोस्ट नहीं करना चाहिए, जहां आप सर्वर के पक्ष में FBserver-> अपने सेवरर को उसी फॉर्म को पुनर्प्राप्त कर सकते हैं।

मेरा सुझाया गया समाधान: उपयोगकर्ता प्रमाणीकृत होने के बाद, सर्वर की ओर से अपने दोस्तों की सूची पुनर्प्राप्त करें। जो भी आप सर्वर की तरफ चाहते हैं, और उपयोगकर्ता स्क्रीन पर परिणाम प्रदर्शित करें।

इस तरह सभी बोझ आपके सर्वर द्वारा लिया जाएगा, उपयोगकर्ता को आपके यूआरएल पर कोई भी बुरा जेसन पोस्ट करने की आवश्यकता नहीं है।

बीटीडब्ल्यू, आपका ऐप विचार अच्छा है।

+0

मैं पहले से ही प्रश्न में उल्लेख करता हूं कि मैं टाइम आउट विकल्प का उपयोग करने में सक्षम नहीं हूं। उपयुक्त टाइमआउट खोजने के लिए संभव नहीं है। –

+0

राजेश मैं पहले से ही इस प्रश्न में उल्लेख करता हूं कि मैं टाइम आउट विकल्प का उपयोग करने में सक्षम नहीं हूं। –

+0

क्षमा करें, मुझे समय के बारे में आपका नोट याद आया। क्या आप त्रुटि को पकड़ने का प्रयास कर सकते हैं?जब सर्वर नहीं मिला है तो इसका "नहीं मिला"। क्या आप त्रुटि को ट्रिगर नहीं कर सकते हैं? यहां: http://jsfiddle.net/epinapala/y4cva/ –

-5
error: function(xhr, textStatus, thrownError) 
        { 
         alert(xhr.status); 
         alert(thrownError); 
         alert(textStatus); 

        } 

उन्हें प्रयास करें .. TextStatus (शून्य के अलावा) "टाइमआउट", "त्रुटि", "गर्भपात", और "parsererror" कर रहे हैं। जब कोई HTTP त्रुटि उत्पन्न होती है, तो फेंकने वाले त्रुटि को HTTP स्थिति का पाठ भाग प्राप्त होता है, जैसे "नहीं मिला" या "आंतरिक सर्वर त्रुटि।"

इंटरनेट डिस्कनेक्ट, प्रतिक्रिया अभ्यस्त प्राप्त हो गया है और अधिक से अधिक यह एक टाइमआउट संदेश होगा ..

+0

कुछ संदर्भ ... http: //api.jquery.com/jQuery.ajax/ और http://api.jquery.com/ajaxError/ –

+2

उत्तर आप केवल तभी काम करते हैं जब सर्वर कुछ जवाब देता है .. लेकिन मेरा प्रश्न अगर अजाक्स कॉल पूरा होने के बीच रद्द हो गया तो उस स्थिति का पता कैसे लगाया जाए। मैं एक उपयोगकर्ता को एक संदेश देना चाहता हूं और पिछली स्थिति में वापस रोल करना चाहता हूं। –

3

तो अपने सर्वर बहुत भीड़ नहीं था, शायद आप एक टाइमर नियमित रूप से जब आप इस्तेमाल कर सकते हैं कनेक्शन का पता लगाने शुरू करने के लिए डेटा को स्थानांतरित करना शुरू करें (उदाहरण के लिए प्रत्येक 5 सेकंड का उपयोग करके)। अब आप टाइमआउट का उपयोग कर सकते हैं।

बीटीडब्ल्यू, 1) टाइमआउट हमेशा नेटवर्क त्रुटि का मतलब नहीं है। कभी-कभी सर्वर का डाउन भी "टाइमआउट"

2) यदि ड्राइवर क्लाइंट डिवाइस पर डाउन है, xhr.sta tus = 0, और कोई टाइमआउट

2

मुझे आपकी तरह की एक जैसी स्थिति का सामना करना पड़ा और प्रत्येक 5 सेकंड के लिए नेटवर्क जांच करके इसे ठीक किया गया और यदि नेटवर्क डिस्कनेक्ट हो गया तो मैं अजाक्स अनुरोध को मैन्युअल रूप से रद्द कर दूंगा जो AJAX अनुरोध को समाप्त कर देगा।

यहां मुझे jquery AJAX कॉल के पहले सेव ईवेंट में AJAX XmlHttpRequest मिलता है और नेटवर्क विफलता के मामले में AJAX अनुरोध को निरस्त करने के लिए उस ऑब्जेक्ट का उपयोग करें।

var interval = null; 
var xhr = null; 

$.ajax({ 
    beforeSend: function(jqXHR, settings) { 
      xhr = jqXHR; // To get the ajax XmlHttpRequest 
    }, 
    url:'server.php', 
    data:'lots of data from 200KB to 5MB', 
    type:'post', 
    success: function(data) 
       { 
        alert('Success'); 
        //some stuff on success 

       }, 
     error: function(XMLHttpRequest, textStatus, errorThrown) 
       { 
        alert('Failure'); 
        //some stuff on failure 
       }, 
     complete: function(data) 
       { 
        alert('Complete'); 
        //To clear the interval on Complete 
        clearInterval(interval); 
       }, 
    }); 

interval = setInterval(function() { 
    var isOnLine = navigator.onLine; 
     if (isOnLine) { 
      // online 
     } else { 
      xhr.abort(); 
     } 
    }, 5000); 
5

इस प्रयास करें:

पहले setInterval के साथ एक "पिंग" ajax कॉल बनाने के हर 5 सेकंड

function server_ping() 
    { 
     $.ajax({ 
      url:"url to ping", 
      type: "POST" 
     }); 
    } 
    var validateSession = setInterval(server_ping, 5000); 

फिर अपने .ajaxError जाल हाथ:

$(document).ajaxError(function(event, request, settings) { 
     //When XHR Status code is 0 there is no connection with the server 
     if (request.status == 0){ 
      alert("Communication with the server is lost!"); 
     } 

    }); 

याद रखें अजाक्स कॉल डिफ़ॉल्ट रूप से असीमित होते हैं, इसलिए जब पिंग सर्वर पर जा रहे हैं और अनुरोध सर्व तक नहीं पहुंच सकता है एक्सएचआर स्थिति पर मूल्य 0 है, और .ajaxError आग लगेगा और आपको त्रुटि को पकड़ना होगा और जिस तरीके से आप इसे चाहते हैं उसे संभालना होगा।

फिर यदि आप डेटा भेजते समय कनेक्शन खो जाते हैं तो आपको सर्वर पर अपना डेटा भेज सकते हैं, आपको पिंग द्वारा रिपोर्ट की गई त्रुटि मिलती है।

2

मैं एक ऐसी ही समस्या थी और एक simpel ट्राई/कैच और (माना) 2 सेकंड की फिर से कोशिश देरी से इसे हल:

function myAjaxMethod() 
{ 
    try 
    { 
    $.ajax({ ... }); 
    } catch (err) 
    { 
    console.log(err.message); 
    setTimeout(function(){myAjaxMethod(),2000}); 
    } 
} 
संबंधित मुद्दे