jQuery AJAX 调用中是不是有任何类似于“终于”的东西?

Posted

技术标签:

【中文标题】jQuery AJAX 调用中是不是有任何类似于“终于”的东西?【英文标题】:Is there any analog to a 'finally' in jQuery AJAX calls?jQuery AJAX 调用中是否有任何类似于“终于”的东西? 【发布时间】:2013-04-02 06:36:10 【问题描述】:

在 jQuery AJAX 调用中是否存在“终于”类似的 Java?我这里有这段代码。在我的 always 中,我抛出了一个异常,但我总是希望它转到 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... 您无法捕获异步抛出的错误,这正是您要寻找的。您需要自己将其包装到 try-catch-finally 语句中。 Always 转到 always() 函数,这就是它如此恰当命名的原因。 除非 jQuery 处理回调中的每个 try/catch,否则throw "something"; 将简单地停止代码执行。 @Bergi,我不熟悉 jQuery 的 Promise impl,但如果它符合 Promises/A+,那么抛出的错误将被传递给传递给 then 的 errorHandler。因此,如果他将第二个函数传递给 then,那将接收“某物”作为参数。 【参考方案1】:

看这个例子:

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

【讨论】:

.complete() 已被弃用;现在使用.always()。 api.jquery.com/jQuery.ajax 喜欢 FUNFAR 动词 :D @mlg: complete 参数没有被弃用,他们只弃用了 .complete() 回调,因为现在 jqXHR 对象实现了 Promise 接口。请参阅此问题的答案:***.com/questions/15821141/…【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

jQuery 的 then 不会在回调中捕获错误。 试过了吗? 对不起,我尝试使用 then->always,并且在 then 中有两个函数,但我仍然遇到同样的问题。 最诚挚的歉意,在查看 jquery 的延迟文档后,我认为这会起作用,但我显然错了,Bergi 正确地指出我应该检查沙箱。【参考方案4】:

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

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

As in official documentation

【讨论】:

【参考方案5】:

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

抱歉英语不好!欢呼;-)

【讨论】:

【参考方案6】:

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

$(document).ajaxComplete(function () 
    console.log('ajax complete on doc');
)

【讨论】:

以上是关于jQuery AJAX 调用中是不是有任何类似于“终于”的东西?的主要内容,如果未能解决你的问题,请参考以下文章

Jquery插件类似于datable,但根据需要具有ajax分页和服务器端搜索

jQuery AJAX 提交表单

JQuery Ajax 调用 PDF 文件下载

jQuery - 在 AJAX 调用之后,旧元素仍然存在于 DOM 中吗?如何去除?

Webmethod jquery ajax调用不返回任何结果

jquery移动列表视图样式在ajax调用后不应用样式