Is there any analog to a 'finally' in jQuery AJAX calls?

后端 未结 6 514
北荒
北荒 2021-02-04 22:45

Is there a Java \'finally\' analogue in jQuery AJAX calls? I have this code here. In my always I throw an exception, however I ALWAYS want it to go to the

相关标签:
6条回答
  • 2021-02-04 23:24

    See this example:

    $.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). 
            }
        });
    

    For more informations: http://api.jquery.com/jquery.ajax/

    0 讨论(0)
  • 2021-02-04 23:26

    The below suggestions will not work in jQuery, because jQuery's promise implementation does not handle errors thrown in methods passed to then. I am only leaving them here as an illustration of what could be possible if jQuery was promises/A+ compliant. As Bergi rightly points out, you will have to manually wrap your code in your own try catch block.

    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");
    });
    

    Although I'm not sure if jquery's promise supports always, an alternative would be to use then (again) and pass the same function as both successHandler and errorHandler, like this :

    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");
    });
    
    0 讨论(0)
  • 2021-02-04 23:32

    .always() should work. See the The jqXHR Object section at http://api.jquery.com/jQuery.ajax/.

    jqXHR.always(function(data|jqXHR, textStatus, jqXHR|errorThrown) { }); An alternative construct to the complete callback option, the .always() method replaces the deprecated .complete() method.

    In response to a successful request, the function's arguments are the same as those of .done(): data, textStatus, and the jqXHR object. For failed requests the arguments are the same as those of .fail(): the jqXHR object, textStatus, and errorThrown. Refer to deferred.always() for implementation details.

    See also http://api.jquery.com/deferred.always/

    0 讨论(0)
  • 2021-02-04 23:35

    There is a bug ajax is dependent on the server, need to check status with "complete" is the best, a kind of "success", "error" and others are not 100% of the PUT, POST and GET ... look at an example

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

    Sorry bad english! Cheer ;-)

    0 讨论(0)
  • 2021-02-04 23:46

    Just a note for those who use jQuery 3.0 and later

    Deprecation Notice: The jqXHR.success(), jqXHR.error(), and jqXHR.complete() callbacks are removed as of jQuery 3.0. You can use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.

    As in official documentation

    0 讨论(0)
  • 2021-02-04 23:46

    if you want one code definition for all ajax requests, you can do it like this

    $(document).ajaxComplete(function () {
        console.log('ajax complete on doc');
    })
    
    0 讨论(0)
提交回复
热议问题