अजाक्स के लिए टाइमआउट सेट करें (jQuery)


195
$.ajax({
    url: "test.html",
    error: function(){
        //do something
    },
    success: function(){
        //do something
    }
});

कभी-कभी successफ़ंक्शन अच्छा काम करता है, कभी-कभी नहीं।

मैं इस ajax अनुरोध के लिए टाइमआउट कैसे निर्धारित करूं? उदाहरण के लिए, 3 सेकंड, यदि समय समाप्त हो गया है, तो एक त्रुटि दिखाएं।

समस्या यह है कि, अजाक्स अनुरोध खत्म होने तक ब्लॉक को जमा देता है। यदि सर्वर थोड़े समय के लिए डाउन होता है, तो यह कभी समाप्त नहीं होगा।


2
आप एक की जरूरत ,के बाद वहाँ }
पिमवेदब


जवाबों:


329

कृपया $.ajax दस्तावेज़ पढ़ें , यह एक कवर किया गया विषय है।

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

आप देख सकते हैं कि error: function(jqXHR, textStatus, errorThrown)विकल्प के टेक्स्टस्टैटस पैरामीटर तक पहुंचकर किस प्रकार की त्रुटि हुई थी । विकल्प "टाइमआउट", "त्रुटि", "गर्भपात", और "पार्सररोर" हैं।


4
त्रुटि टाइमआउट को पकड़ने के बारे में stackoverflow.com/questions/3543683/...
एड्रियन बनें

1
बस मेरे लिए काम करने के लिए प्रतीत नहीं होता है, टाइमआउट: 1, पुष्टि की है कि यह पारित हो रहा है, बस कभी बाहर नहीं
पांडा

एक कोशिश / पकड़ के साथ पूरे $ .ajax कॉल को लपेटना सुनिश्चित करें। एब्स को jQuery द्वारा नहीं पकड़ा जाता है और $ .ajax कॉल के बाहर फेंक दिया जाएगा।
justdan23

112

यहाँ कुछ उदाहरण दिए गए हैं जो jQuery के पुराने और नए प्रतिमानों में टाइमआउट की स्थापना और पता लगाते हैं।

Live Demo

JQuery के साथ वादा 1.8+

Promise.resolve(
  $.ajax({
    url: '/getData',
    timeout:3000 //3 second timeout
  })
).then(function(){
  //do something
}).catch(function(e) {
  if(e.statusText == 'timeout')
  {     
    alert('Native Promise: Failed from timeout'); 
    //do something. Try again perhaps?
  }
});

jQuery 1.8+

$.ajax({
    url: '/getData',
    timeout:3000 //3 second timeout
}).done(function(){
    //do something
}).fail(function(jqXHR, textStatus){
    if(textStatus === 'timeout')
    {     
        alert('Failed from timeout'); 
        //do something. Try again perhaps?
    }
});​

jQuery <= 1.7.2

$.ajax({
    url: '/getData',
    error: function(jqXHR, textStatus){
        if(textStatus === 'timeout')
        {     
             alert('Failed from timeout');         
            //do something. Try again perhaps?
        }
    },
    success: function(){
        //do something
    },
    timeout:3000 //3 second timeout
});

ध्यान दें कि textStatus param (या jqXHR.statusText ) आपको बताएगा कि त्रुटि क्या थी। यह उपयोगी हो सकता है यदि आप जानना चाहते हैं कि विफलता एक टाइमआउट के कारण हुई थी।

त्रुटि (jqXHR, textStatus, errorThrown)

एक फ़ंक्शन जिसे अनुरोध विफल होने पर बुलाया जाता है। फ़ंक्शन को तीन तर्क मिलते हैं: jqXHR (jQuery 1.4.x, XMLHttpRequest में) ऑब्जेक्ट, एक स्ट्रिंग जो त्रुटि के प्रकार और एक वैकल्पिक अपवाद ऑब्जेक्ट का वर्णन करता है, यदि कोई हुआ। दूसरे तर्क के लिए संभावित मान (शून्य के अलावा) "टाइमआउट", "त्रुटि", "गर्भपात", और "पारसेरोर" हैं। जब कोई HTTP त्रुटि होती है, तो errorThrown HTTP स्थिति का पाठ भाग प्राप्त करता है, जैसे कि "Not Found" या "आंतरिक त्रुटि"। JQuery 1.5 के अनुसार, त्रुटि सेटिंग कार्यों की एक सरणी को स्वीकार कर सकती है। प्रत्येक फ़ंक्शन को बदले में बुलाया जाएगा। नोट: इस हैंडलर को क्रॉस-डोमेन स्क्रिप्ट और JSONP अनुरोधों के लिए नहीं कहा जाता है।

src: http://api.jquery.com/jQuery.ajax/


बीच क्या अंतर है $.ajax().fail()और $.ajax().error()?
अलेजांद्रो गार्सिया इग्लेसियस

1
@ गार्सियावेबडेव - जेकरी अजाक्स को कॉल
ब्रैंडन बून

3
JQuery 1.8+ को शामिल करने के लिए +1। इसी तरह के सवालों के अधिकांश अन्य उत्तर में केवल सफलता / त्रुटि शामिल है <।
ब्रैंडनस्क्रिप्ट

22

आप timeoutइस तरह ajax विकल्पों में सेटिंग का उपयोग कर सकते हैं :

$.ajax({
    url: "test.html",
    timeout: 3000,
    error: function(){
        //do something
    },
    success: function(){
        //do something
    }
});

यहाँ ajax विकल्पों के बारे में सभी पढ़ें: http://api.jquery.com/jQuery.ajax/

याद रखें कि जब कोई टाइमआउट होता है, तो errorहैंडलर ट्रिगर होता है न कि successहैंडलर :)


2

पूर्ण विशेषताओं वाले .ajaxjQuery फ़ंक्शन का उपयोग करें । एक उदाहरण के लिए https://stackoverflow.com/a/3543713/1689451 से तुलना करें ।

परीक्षण के बिना, केवल संदर्भित एसओ प्रश्न के साथ अपने कोड को मर्ज करना:

target = $(this).attr('data-target');

$.ajax({
    url: $(this).attr('href'),
    type: "GET",
    timeout: 2000,
    success: function(response) { $(target).modal({
        show: true
    }); },
    error: function(x, t, m) {
        if(t==="timeout") {
            alert("got timeout");
        } else {
            alert(t);
        }
    }
});​

H-Bahrami और रुडोल्फ मुहालबर के उत्तर के लिए धन्यवाद, लेकिन मैं अजाक्स में नया हूँ इसलिए कृपया मेरे कोड के माध्यम से स्पष्ट करें ... क्योंकि मुझे ये उत्तर पहले से ही दिखाई दे रहे हैं लेकिन मुझे नहीं पता कि क्या हो रहा है..तो कृपया मेरी मदद करें ...

मैं .load () के माध्यम से कैसे कर सकता हूं? यह संभव है या नहीं?

@SS, लोड के दस्तावेज़ीकरण में टाइमआउट की तलाश करें: api.jquery.com/load - और मेरे पास अपने कोड में एक टाइपो था, ठीक किया गया।
रुडोल्फ मुलहबॉउर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.