在 jQuery AJAX 调用中有没有类似于“ finally”的东西?

在 jQueryAJAX 调用中是否存在 Java 的“ finally”类似?我这里有密码。在我的 一直都是我抛出一个异常,但我总是希望它去 那么(())方法。

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

我试过使用 完成()完整()和另一个 总是,但似乎没有工作。

下面是 JSFiddle:

Http://jsfiddle.net/qv3t3l0m/

84110 次浏览

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

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/

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

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

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