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

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


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/


.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/


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