वहाँ jQuery AJAX कॉल में एक 'अंत' के लिए कोई एनालॉग है?


84

वहाँ jQuery AJAX कॉल में एक जावा 'अंत में' एनालॉग है? मेरे पास यह कोड है। अपने हमेशा के लिए मैं एक अपवाद फेंक देता हूं, हालांकि मैं हमेशा चाहता हूं कि यह तब () विधि पर जाए।

    call.xmlHttpReq = $.ajax({
        url : url,
        dataType : 'json',
        type : 'GET'
    }).always(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

       throw "something";

    }).then(function() {

        alert("i want to always run no matter what");
    });

मैंने किए गए () , पूर्ण () , और दूसरे हमेशा () का उपयोग करने की कोशिश की है , लेकिन कुछ भी काम नहीं करता है।

यहाँ JSField है:

http://jsfiddle.net/qv3t3L0m/


बस इसे करने के लिए संलग्न always...
डेविड फ्रीगोली

1
आप अतुल्यकालिक रूप से उन त्रुटियों को नहीं पकड़ सकते जो आप खोज रहे हैं। आपको इसे try-catch-finallyस्वयं एक वक्तव्य में लपेटने की आवश्यकता होगी ।
बेर्गी

3
यह हमेशा हमेशा () फ़ंक्शन पर जाता है, इसीलिए इसे उपयुक्त नाम दिया गया है।
एडेनो

जब तक jQuery एक कॉलबैक में हर कोशिश / पकड़ को संभालता है, throw "something";बस कोड निष्पादन को रोक देगा।
plalx

@ बर्गी, मैं jQuery के वादों से परिचित नहीं हूं, लेकिन अगर यह वादा / ए + अनुपालन है, तो फेंकी गई त्रुटियों को तब तक पारित किए गए एक त्रुटिहैंडलर को दिया जाएगा। इसलिए यदि वह दूसरा कार्य करता है, तो वह पैरामीटर के रूप में "कुछ" प्राप्त करेगा।
डेविड मैकमुलिन

जवाबों:


130

इस उदाहरण को देखें:

$.ajax({
        type: "GET",
        dataType: dataType,
        contentType: contentType,
        async: TRUE,
        url: $('html form:nth-child(1)').attr('action') + "?" $('html form:nth-child(1)').serialize(),
        success: function(data) {
            console.log("FUNFOU!");
        },
        error: function(data) {
            console.log("NÃO FUNFOU!");
        },
        complete: function(data) {
            console.log("SEMPRE FUNFA!"); 
            //A function to be called when the request finishes 
            // (after success and error callbacks are executed). 
        }
    });

अधिक जानकारी के लिए: http://api.jquery.com/jquery.ajax/


27
.complete()पदावनत कर दिया गया है; .always()अब उपयोग करें । api.jquery.com/jQuery.ajax
mlg

4
FUNFAR क्रिया के लिए पसंद किया गया: D
ब्रूनो रॉड्रिक्स

4
@mlg: पूर्ण पैरामीटर को पदावनत नहीं किया जाता है, उन्होंने केवल पदावनत (।) कॉलबैक () कॉलबैक किया है, क्योंकि अब jqXHR ऑब्जेक्ट प्रॉमिस इंटरफ़ेस लागू करते हैं। इस प्रश्न का उत्तर देखें: stackoverflow.com/questions/15821141/…
jeanie77

45

.always()कार्य करना चाहिए। देखें jqXHR वस्तु पर खंड http://api.jquery.com/jQuery.ajax/

jqXHR.always (फ़ंक्शन (डेटा | jqXHR, textStatus, jqXHR। errorThrown) {}); पूर्ण कॉलबैक विकल्प के लिए एक वैकल्पिक निर्माण, .always () विधि पदावनत .complete () विधि की जगह लेती है।

एक सफल अनुरोध के जवाब में, फ़ंक्शन की दलीलें .done (): डेटा, टेक्स्टस्टैटस और jqXHR ऑब्जेक्ट के समान हैं। असफल अनुरोधों के लिए तर्क .fail (): jqXHR ऑब्जेक्ट, टेक्स्टस्टैटस और एररथ्रोवन के समान हैं। कार्यान्वयन विवरणों के लिए deferred.always () का संदर्भ लें।

Http://api.jquery.com/deferred.always/ भी देखें


11

नीचे दिए गए सुझाव jQuery में काम नहीं करेंगे, क्योंकि jQuery का वादा कार्यान्वयन तब पारित तरीकों में फेंकी गई त्रुटियों को नहीं संभालता है। मैं केवल उन्हें यहाँ एक उदाहरण के रूप में छोड़ रहा हूँ कि क्या संभव हो सकता है अगर jQuery के वादे / A + अनुरूप थे। जैसा कि बर्गी ठीक ही कहती है, आपको अपने कोड को अपने स्वयं के ट्रैप कैच ब्लॉक में मैन्युअल रूप से लपेटना होगा।

call.xmlHttpReq = $.ajax({
    url : url,
    dataType : 'json',
    type : 'GET'
}).then(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

   throw "something";

}).always(function() {

    alert("i want to always run no matter what");
});

हालांकि मुझे यकीन नहीं है कि अगर jquery का वादा हमेशा समर्थन करता है, तो एक विकल्प फिर (फिर से) का उपयोग करेगा और उत्तराधिकारी और एरंडरहैंडलर दोनों के समान फ़ंक्शन पास करेगा, जैसे:

call.xmlHttpReq = $.ajax({
    url : url,
    dataType : 'json',
    type : 'GET'
}).then(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

   throw "something";

}).then(function() {

    alert("i want to always run no matter what");
},
function() {

    alert("i want to always run no matter what");
});

jQuery thenकॉलबैक में त्रुटियों को नहीं पकड़ता है। क्या आपने यह कोशिश की?
बर्गी

क्षमा करें, मैंने तब -> का उपयोग करने की कोशिश की, और तब मेरे दो कार्य हुए, लेकिन मुझे अभी भी वही समस्या है।
ओलिवर वाटकिंस

ईमानदारी से माफी, jquery के आस्थगित डॉक्स को देखने के बाद मुझे लगा कि यह काम करेगा, लेकिन मुझे स्पष्ट रूप से गलत किया गया था और बर्गी ने ठीक ही इंगित किया है कि मुझे सैंडबॉक्स में जांचना चाहिए था।
डेविड मैकमुलिन

3

सिर्फ jQuery 3.0 और बाद में उपयोग करने वालों के लिए एक नोट

पदावनति सूचना: jqXHR.success (), jqXHR.error (), और jqXHR.complete () कॉलबैक jQuery 3.0 के रूप में हटा दिए जाते हैं। आप इसके बजाय jqXHR.done (), jqXHR.fail (), और jqXHR.always () का उपयोग कर सकते हैं।

जैसा कि आधिकारिक दस्तावेज में है


2

एक बग अजाक्स सर्वर पर निर्भर है, "पूर्ण" के साथ स्थिति की जांच करने की आवश्यकता है सबसे अच्छा है, "सफलता", "त्रुटि" का एक प्रकार है और अन्य 100% PUT, POST और GET नहीं हैं ... देखो एक उदाहरण पर

$.ajax({
    url: '/api/v2/tickets/123456.json',
    ....
    ....
    ....
    complete: function(data) { 
        if (data.statusText == "success") { 
            console.log("Sent successfully");
        } else { 
            console.log("Not Sent");
        }
    }
});

क्षमा करें बुरा अंग्रेजी! खुश हो जाओ ;-)


1

यदि आप सभी ajax अनुरोधों के लिए एक कोड परिभाषा चाहते हैं, तो आप इसे इस तरह से कर सकते हैं

$(document).ajaxComplete(function () {
    console.log('ajax complete on doc');
})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.