【问题标题】:Jquery ajax error callbackjQuery ajax 错误回调
【发布时间】:2010-09-04 12:48:33
【问题描述】:

我需要一些建议或者一些解释。我有一个 jquery ajax 调用,

$.ajax({
 type: "GET",
 url: base_url+'/ajax/fetch/counts/',
 dataType: 'json',
 data: {},
 error: function(xhr, error){
        console.debug(xhr); console.debug(error);
 },
 success: display_counts
});

一切正常。我的success 回调正确触发并响应。但是,我注意到我的 error 回调每次都会被触发,即使我的调用返回成功状态 200。在上面的 error 回调中,我看到对象 xhr.status 是 200。

谁能解释一下出了什么问题,或者这里发生了什么? error 回调应该仅在我有 404 或非 200 响应时触发。我的假设是否正确?

谢谢。

【问题讨论】:

    标签: jquery ajax


    【解决方案1】:

    只是一个建议,尝试使用$.ajaxSetup() 得到正确的错误,如下所示:

    $(function() {
        $.ajaxSetup({
            error: function(jqXHR, exception) {
                if (jqXHR.status === 0) {
                    alert('Not connect.\n Verify Network.');
                } else if (jqXHR.status == 404) {
                    alert('Requested page not found. [404]');
                } else if (jqXHR.status == 500) {
                    alert('Internal Server Error [500].');
                } else if (exception === 'parsererror') {
                    alert('Requested JSON parse failed.');
                } else if (exception === 'timeout') {
                    alert('Time out error.');
                } else if (exception === 'abort') {
                    alert('Ajax request aborted.');
                } else {
                    alert('Uncaught Error.\n' + jqXHR.responseText);
                }
            }
        });
    });
    

    【讨论】:

    • 顺便说一句,the Docs state注意:全局回调函数应该使用它们各自的全局 Ajax 事件处理方法来设置——.ajaxStart()、.ajaxStop()、.ajaxComplete( ), .ajaxError(), .ajaxSuccess(), .ajaxSend()——而不是在 $.ajaxSetup() 的选项对象中。 所以看起来这在.ajaxError() 中使用会更好跨度>
    • 因此,当然要意识到的重要一点是,如果用户的 Internet 连接不稳定,您的 ajax 可能会在用户的计算机上失败。因此,您的应用程序可能运行良好,但由于互联网连接不良,它们会收到失败的 ajax 请求 - 这似乎可以通过上面的 status === 0exception === 'timeout' 案例来识别。
    • 另请注意,文档声明:“这可能会导致不良行为,因为其他调用者(例如,插件)可能期望正常的默认设置。因此,我们强烈建议不要使用此设置API。"
    【解决方案2】:

    在 http 错误时调用错误回调,但也如果响应上的 JSON 解析失败。如果响应代码为 200,但您仍然被抛出错误回调,则可能会发生这种情况。

    【讨论】:

    • 如果您期待非 JSON 响应。您可以将 dataType 选项设置为 script/text...etc Checkout api.jquery.com/jQuery.ajax 并在 dataFilter 下查看更多信息。
    • 我正在调用一个 cgi 脚本,我需要它以 json 格式转储数据。它返回一个失败的字符串。
    【解决方案3】:

    我能想到的几点:

    1. 确保您已通过设置 cache: false 禁用缓存。
    2. 如果您使用的是 Firefox,请尝试使用 Firebug 和 Net 选项卡来监控请求
    3. 不要依赖浏览器的 JSON 解析器。我会推荐这个:https://github.com/douglascrockford/JSON-js/blob/master/json2.js 来自 JSON 的创建者不少

    【讨论】:

    • “琐碎而明显”——嗯,这简直太苛刻了。 :)
    • 对不起,如果这真的很苛刻。 +1 已经用于引用 JSON 解析器的东西。 :)
    • @SimpleCoder "不要依赖浏览器的 JSON 解析器"??为什么?现在还一样吗??
    • @mfadel:一些较旧的浏览器不支持 JSON,因此首先使用第三方解析器可以防止兼容性问题。
    【解决方案4】:

    recent questionjson jquery 请求有类似问题,请尝试从您的 json 响应中删除周围的 ()

    【讨论】:

    • 有趣的是,我遇到了类似的问题,通过添加括号解决了。
    • @Coronatus 是的,这是我以前经常做的,但是jquery 1.4.2开始依赖浏览器的JSON.parse,我的firefox的JSON.parse会成功解析{"key":"value"},但是会报错在({"key":"value"}).
    • 为了解决浏览器解析 JSON 的差异,我建议使用 Douglas Crockford 的解析器:json.org/json2.js
    【解决方案5】:

    我不是 jQuery 专家,但我知道使用 Prototype.js,如果请求成功,AJAX 错误处理程序会触发,但 success 处理程序会导致错误。在 jQuery 中是一样的吗?您可以通过将display_counts 的全部内容放在try..catch block 中来测试是否发生了这种情况。

    【讨论】:

      【解决方案6】:

      dataTypeplain/text 更改为 html

      【讨论】:

      • ...但是 OP 甚至没有纯文本数据类型
      猜你喜欢
      • 2012-08-17
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 2016-01-07
      • 2016-03-11
      • 1970-01-01
      相关资源
      最近更新 更多