जेकरी अजाक्स त्रुटि को नजरअंदाज करने के लिए हैंडलिंग


81

मैं ajax कॉल के लिए एक वैश्विक त्रुटि से निपटने की विधि चाहता हूं, यही अब मेरे पास है:

$.ajaxSetup({
  error: function (XMLHttpRequest, textStatus, errorThrown) {
    displayError();
  }
});

मुझे त्रुटि को नजरअंदाज करने की जरूरत है abortederrorThrownअशक्त है और textStatusहै error। मैं कैसे जांच करूं aborted?


4
मेरे लिए textStatus "abort" है। मैं देख रहा हूं कि यह एक पुराना सवाल है - शायद यह बदल गया है।
जैकॉकनर

मेरे लिए, यह अभी भी "त्रुटि" है।
जानिस एल्मेरिस

हाँ दुख की बात है कि यह ब्राउज़र पर निर्भर करता है।
क्रिस्टोफ रूसो

इसे भी देखें: github.com/angular/angular.js/issues/15924 (2017)
Christophe Roussy

1
यदि आप abortमैन्युअल रूप से कॉल कर रहे हैं (और मुझे यकीन नहीं है कि कब इसे कॉल किया जाएगा) तो आप त्रुटि संदेश में पास कर सकते हैं abort("abort"):।
MyEEye

जवाबों:


52

मुझे आज उसी उपयोग के मामले से निपटना पड़ा। मैं जिस ऐप पर काम कर रहा हूं उसमें ये लंबे समय से चल रहे अजाक्स कॉल हैं जो 1 से बाधित हो सकते हैं) उपयोगकर्ता दूर नेविगेट कर रहा है या 2) किसी प्रकार का अस्थायी कनेक्शन / सर्वर विफलता है। मैं चाहता हूं कि त्रुटि हैंडलर केवल कनेक्शन / सर्वर विफलता के लिए चलाए और न कि उपयोगकर्ता को नेविगेट करने के लिए।

मैंने पहली बार एलेस्टेयर पिट्स के उत्तर की कोशिश की, लेकिन यह काम नहीं आया क्योंकि दोनों अनुरोधों और कनेक्शन विफलता ने स्थिति कोड निर्धारित किया और 0. के लिए तैयार किया। अगला, मैंने sieppl के उत्तर की कोशिश की; यह भी काम नहीं किया क्योंकि दोनों मामलों में, कोई प्रतिक्रिया नहीं दी गई है, इस प्रकार कोई हेडर नहीं है।

मेरे लिए काम करने वाला एकमात्र समाधान window.onbeforeunload के लिए एक श्रोता सेट करना है, जो यह इंगित करने के लिए एक वैश्विक चर सेट करता है कि पृष्ठ अनलोड किया गया है। त्रुटि हैंडलर तब जांच कर सकता है और केवल त्रुटि हैंडलर को कॉल कर सकता है यदि पृष्ठ अनलोड नहीं किया गया है।

var globalVars = {unloaded:false};
$(window).bind('beforeunload', function(){
    globalVars.unloaded = true;
});
...
$.ajax({
    error: function(jqXHR,status,error){
        if (globalVars.unloaded)
            return;
    }
});

4
यह काम नहीं करता है यदि कोई अजाक्स अनुरोध जावास्क्रिप्ट द्वारा बाधित हो जाता है
Sano J

1
यह मान्य उत्तर नहीं है। पहले से लोडिंग अनलोडिंग को रद्द किया जा सकता है। यदि ऐसा होता है, तो बाद की सभी अजाक्स त्रुटियों को नजरअंदाज कर दिया जाएगा।
LOST

@LOST beforeunloadहैंडलर उपयोगकर्ता-परिभाषित है। trueयदि आप उसी विधि में अनलोडिंग रद्द करने जा रहे हैं, तो आप GlobalVars.unloaded को क्यों सेट करेंगे ?
bluecollarcoder

@bluecollarcoder सब मैं कह रहा हूं कि यदि आपके पास एक बड़ी परियोजना है, जहां आप इस समस्या का सामना करते हैं, तो आपको इसमें जाने से पहले सभी को लोड करना होगा और इसमें हनलोड लोड करना होगा, यह केवल आपके द्वारा प्रदान किए गए एक नए को जोड़ने के लिए पर्याप्त नहीं है।
LOST

beforeunloadतब नहीं कहा जाता है जब उपयोगकर्ता किसी अन्य पृष्ठ पर नेविगेट करता है या बहुत देर से बुलाया जाता है?
क्रिस्टोफ रूसो

43

आधुनिक jQuery में आप बस यह देख सकते हैं कि request.statusTextक्या इसके बराबर है 'abort':

error: function (request, textStatus, errorThrown) {
    if (request.statusText =='abort') {
        return;
    }
}

4
क्रोम में, मैं "गर्भपात" के लिए जांच कर सकता हूं। फ़ायरफ़ॉक्स में, मुझे "त्रुटि" मिलती है। @Bluecollarcoder से समाधान हमारे लिए सबसे अच्छा लगता है।
foxontherock

हां यह ब्राउज़र (सामान्य वेब समस्याओं ...) पर निर्भर करता है
क्रिस्टोफ रूसो

21

मुझे कुछ ऐसा मिला है, जब गर्भपात का अनुरोध है, statusऔर / या readyStateबराबर है 0

मेरे वैश्विक त्रुटि हैंडलर में, मेरे पास विधि के शीर्ष पर एक चेक है:

$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) {
    //If either of these are true, then it's not a true error and we don't care
    if (jqXHR.status === 0 || jqXHR.readyState === 0) {
        return;
    }

    //Do Stuff Here
});

मैंने पाया है कि यह मेरे लिए पूरी तरह से काम करता है। आशा है कि यह आपकी मदद करता है, या किसी और को जो इस में चलता है :)


3
मैं एक ही स्थिति प्राप्त करता हूं और तैयार हो जाता हूं अगर ajax शुरू करने के लिए सर्वर से कनेक्ट नहीं हो पाता। लेकिन यह त्रुटि है जिसे मैं संभालना चाहता हूं। केवल गर्भपात नहीं हुआ।
मेटर

हां यह अन्य त्रुटियों को मुखौटा करेगा जो आप देखना चाहते हैं।
क्रिस्टोफ रूसो

10

आप टेक्स्टस्टैटस तर्क को अपनी त्रुटि फ़ंक्शन में देखना चाहते हैं। Http://api.jquery.com/jQuery.ajax/ के अनुसार , यह "सफलता", "notmodified", "error", "timeout", "abort", या "parsererror" मूल्यों को ले सकता है। "गर्भपात" जाहिर है कि आप किसके खिलाफ जांच करना चाहते हैं।

यहां लंबे नोट: jquery-gotcha-error-callback-triggered-on-xhr-abort


मुझे लगता है कि हम इस के साथ खेले और यह गर्भपात त्रुटि संदेशों के प्रकार का पता लगाने के लिए हमारे पास नहीं था।
सीपेल

5

क्‍योंकि bluecollarcoders का उत्तर javascript द्वारा निरस्‍त किए गए ajax अनुरोधों के लिए काम नहीं करता है, यहाँ मेरा समाधान है:

var unloaded = false;
...
$(window).bind('beforeunload', function(){
    unloaded = true;
});


$(document).ajaxError(function(event, request, settings) {
    if (unloaded || request.statusText == "abort") {
        return;
    }
    ...
}

जैसे

handler = jQuery.get("foo")
handler.abort()

अब ajaxError हैंडलर द्वारा अनदेखा किया जाएगा


3

एलिस्टेयर पिट्स के उत्तर पर निर्माण , आप अधिक जानकारीपूर्ण संदेश देने के लिए भी ऐसा कर सकते हैं:

$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError)
{
    {
        if (jqXHR.status === 0)
        {
            alert('Not connect.\n Verify Network.');
        } else if (jqXHR.status == 404)
        {
            alert('Requested page not found. [404]');
        } else if (jqXHR.status == 500)
        {
            alert('Internal Server Error [500].');
        } else if (exception === 'parsererror')
        {
            alert('Requested JSON parse failed.');
        } else if (exception === 'timeout')
        {
            alert('Time out error.');
        } else if (exception === 'abort')
        {
            alert('Ajax request aborted.');
        } else
        {
            alert('Uncaught Error.\n' + jqXHR.responseText);
        }
    }
});

2
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {

    if (!jqXHR.getAllResponseHeaders()) {
        return;
    }           
}); 

1
मदद भी नहीं करता है। सर्वर के लिए निरस्त अनुरोधों और कनेक्शन त्रुटियों दोनों के लिए प्रतिक्रिया हेडर खाली हैं।
क्लोविस छह

@ClovisSix हाँ, उपरोक्त समाधान की जाँच करता है कि क्या प्रतिक्रिया शीर्ष लेख खाली है और त्रुटि संदेशों को परेशान करने वाले सर्पोट हैं। हमारे द्वारा चलाए जा रहे कई वाणिज्यिक प्रणाली पर ठीक काम करता है। क्या आप कृपया अधिक जानकारी दे सकते हैं कि आप क्या हासिल करने की कोशिश करते हैं / आपकी समस्या क्या है?
सिप्पल

यदि हमारा कोई अनुरोध सर्वर से कनेक्ट नहीं हो सकता है तो हम संदेश दिखा रहे हैं। हम उन्हें मैन्युअल गर्भपात पर नहीं दिखाते हैं, लेकिन सबसे बड़ी समस्या यह थी कि जब उपयोगकर्ता अगले पृष्ठ पर दूर चला जाता है, जो कनेक्शन त्रुटियों का सामना करता है और गर्भपात के अनुरोध और कनेक्शन त्रुटि के बीच अंतर करने का कोई तरीका नहीं था। मैंने window.onbeforeunload पर एक var सेट करके समस्या का समाधान किया। जो बहुत अधिक एक मैनुअल गर्भपात का पता लगाता है।
क्लोविस छह

यहाँ भी अधिक विवरण के साथ: ilikestuffblog.com/2009/11/30/…
Christophe Roussy

0

मेरे पास यहाँ भी यही मुद्दा था, और मैंने समाधान के रूप में एक "गर्भपात" संस्करण सेट करने के लिए जो कुछ किया था, वह नीचे दिया गया था:

aborting = true;
myAjax.abort();

और केवल त्रुटि अजाक्स अनुरोध के त्रुटि हैंडलर पर दिखाते हैं, अगर गर्भपात सच नहीं है।

$.ajax({
    [..]
    error: function() {
        if ( !aborting ) {
            // do some stuff..
        }
        aborting = false;
    }
});

0

यदि आप ajax अनुरोध को मैन्युअल रूप से निरस्त करते हैं, तो आप इस तरह कर सकते हैं:

var xhr;
function queryData () {
    if (xhr) {
      // tag it's been aborted
      xhr.hasAborted = true;

      // manually canceled request
      xhr.abort();
    }

    xhr = $.ajax({
        url: '...',
        error: function () {
            if (!xhr.hasAborted) {
                console.log('Internal Server Error!');
            }
        },
        complete: function () {
           xhr = null;
        }
    });
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.