95

jQuery AJAX 调用中是否存在 Java“终于”类似物?我这里有这段代码。我总是抛出一个异常,但是我总是希望它转到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");
    });

我曾尝试使用done()complete()和另一个always(),但似乎没有任何效果。

这是 JSFiddle :

http://jsfiddle.net/qv3t3L0m/

4

6 回答 6

155

看这个例子:

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

于 2014-02-12T01:05:58.663 回答
46

.always()应该管用。请参阅http://api.jquery.com/jQuery.ajax/上的 jqXHR 对象部分。

jqXHR.always(函数(数据|jqXHR, textStatus, jqXHR|errorThrown) { }); 完成回调选项的替代构造,.always() 方法替换了已弃用的 .complete() 方法。

响应成功的请求,该函数的参数与 .done() 的参数相同:data、textStatus 和 jqXHR 对象。对于失败的请求,参数与 .fail() 的参数相同:jqXHR 对象、textStatus 和 errorThrown。有关实现细节,请参阅 deferred.always()。

另请参阅http://api.jquery.com/deferred.always/

于 2013-04-10T12:18:20.410 回答
13

以下建议在 jQuery 中不起作用,因为 jQuery 的 promise 实现不处理传递给 then 的方法中抛出的错误。我只是将它们留在这里作为说明如果 jQuery 符合 promises/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");
});
于 2013-04-10T12:32:49.917 回答
3

给那些使用 jQuery 3.0 及更高版本的人的注意事项

弃用通知:jqXHR.success()、jqXHR.error() 和 jqXHR.complete() 回调从 jQuery 3.0 开始被删除。您可以改用 jqXHR.done()、jqXHR.fail() 和 jqXHR.always()。

如官方文档

于 2017-06-23T05:34:07.047 回答
2

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

对不起英语不好!欢呼;-)

于 2016-04-06T13:29:14.350 回答
1

如果您想要所有 ajax 请求的一个代码定义,您可以这样做

$(document).ajaxComplete(function () {
    console.log('ajax complete on doc');
})
于 2018-12-20T21:40:51.137 回答