在jQuery AJAX调用中有没有类似于'finally'的模拟?

时间:2013-04-10 12:14:55

标签: javascript jquery ajax promise

在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:

http://jsfiddle.net/qv3t3L0m/

6 个答案:

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

了解更多信息:http://api.jquery.com/jquery.ajax/

答案 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()   有关实施细节。

另见http://api.jquery.com/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()代替。

As in official documentation

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