在jQuery AJAX调用中是否存在Java'finally'模拟?我这里有这个代码。在我的总是中我抛出异常,但是我总是希望它转到 then()方法。
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:
答案 0 :(得分:77)
见这个例子:
$.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).
}
});
答案 1 :(得分:33)
.always()
应该有效。请参阅http://api.jquery.com/jQuery.ajax/上的 jqXHR对象部分。
jqXHR.always(function(data | jqXHR,textStatus,jqXHR | errorThrown){}); 完整回调选项的另一种结构,即 .always()方法替换了已弃用的.complete()方法。
响应成功的请求,函数的参数是 与.done():data,textStatus和jqXHR对象相同。对于 失败的请求参数与.fail()的参数相同: jqXHR对象,textStatus和errorThrown。参考deferred.always() 有关实施细节。
答案 2 :(得分:8)
以下建议在jQuery中不起作用,因为jQuery的promise实现不会处理传递给当时的方法中抛出的错误。我只是把它们留在这里作为jQuery是承诺/ A +兼容可能的例证。正如Bergi正确指出的那样,您必须手动将代码包装在自己的try catch块中。
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的promise是否始终支持,但另一种方法是使用then(再次)并传递与successHandler和errorHandler相同的函数,如下所示:
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");
});
答案 3 :(得分:2)
对于那些使用jQuery 3.0及更高版本的人来说只是一个注释
弃用通知:从jQuery 3.0开始,jqXHR.success(),jqXHR.error()和jqXHR.complete()回调被删除。您可以使用jqXHR.done(),jqXHR.fail()和jqXHR.always()代替。
答案 4 :(得分:1)
ajax依赖于服务器有一个bug,需要用"完成"是最好的,一种成功","错误"和其他人不是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");
}
}
});
抱歉英语不好!干杯; - )
答案 5 :(得分:0)
如果您希望所有ajax请求都定义一个代码,则可以这样做
$(document).ajaxComplete(function () {
console.log('ajax complete on doc');
})