jQuery AJAX调用中是否有与“最终”类似的东西?


80

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/


只需将其附加到always...
David Fregoli

1
您无法找到要查找的异步引发的错误。您需要自己将其包装为try-catch-finally语句。
Bergi 2013年

3
总是转到always()函数,这就是为什么它是如此恰当地命名的原因。
adeneo 2013年

除非jQuery处理回调中的每个try / catch,throw "something";否则它们只会停止执行代码。
plalx

@Bergi,我对jQuery的Promise Impl不熟悉,但是如果它符合Promises / A +的要求,则抛出的错误将传递给传递给then的errorHandler。因此,如果他将第二个函数传递给then,它将接收“某物”作为参数。
David McMullin

Answers:


127

请参阅以下示例:

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


26
.complete()已不推荐使用;.always()现在使用。api.jquery.com/jQuery.ajax
MLG

4
喜欢FUNFAR动词:D
Bruno Rodrigues

4
@mlg:complete参数不被弃用,它们仅不建议使用.complete()回调,因为现在jqXHR对象实现了Promise接口。见这个问题的答案:stackoverflow.com/questions/15821141/...
jeanie77

45

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

jqXHR.always(function(data | jqXHR,textStatus,jqXHR | errorThrown){}); .always()方法是complete回调选项的替代构造,它取代了不建议使用的.complete()方法。

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

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


11

以下建议在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");
});

jQuerythen不会在回调中捕获错误。你尝试过吗?
Bergi 2013年

抱歉,我尝试使用then-> always,并且那时具有两个功能,但是仍然遇到相同的问题。
奥利弗·沃特金斯

真诚的道歉,在查看了jquery的延期文档后,我认为这是可行的,但是我显然误会了,Bergi正确地指出我应该在沙盒中检查一下。
David McMullin

3

那些使用jQuery 3.0及更高版本的人请注意

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

如官方文档中


2

ajax有一个错误取决于服务器,需要检查状态为“完成”是最好的,一种“成功”,“错误”等不是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");
        }
    }
});

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


1

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

$(document).ajaxComplete(function () {
    console.log('ajax complete on doc');
})
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.