jQuery Ajax错误回调

41

我需要一些建议或者解释。我有一个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响应时才会触发。我的假设正确吗?

谢谢。

6个回答

39

只是一个建议,尝试使用$.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);
            }
        }
    });
});

1
仅作为旁注,文档说明注意:全局回调函数应该使用它们各自的全局Ajax事件处理程序方法——.ajaxStart()、.ajaxStop()、.ajaxComplete()、.ajaxError()、.ajaxSuccess()、.ajaxSend()——而不是在$.ajaxSetup()选项对象中设置。因此,似乎最好在.ajaxError()中使用它。 - Wesley Smith
1
当然,需要意识到的一件重要事情是,如果用户的互联网连接不稳定,您的ajax可能会在他们的计算机上失败。因此,您的应用程序可能运行良好,但由于糟糕的互联网连接而导致失败的ajax请求 - 这似乎可以通过上述status === 0exception === 'timeout'情况进行识别。 - Brad Parks
1
还要注意文档中指出:“这可能会导致不良行为,因为其他调用者(例如插件)可能期望正常的默认设置。因此,我们强烈建议不要使用此API。” - eis

35

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


2
如果你期望的是非 JSON 格式的响应,你可以将 dataType 选项设置为 script/text...等。请查看 http://api.jquery.com/jQuery.ajax 并在 dataFilter 下查找更多信息。 - thekindofme
我正在调用一个cgi脚本,需要它以json格式输出数据。但它返回的字符串失败了。 - NuclearPeon

2
最近有类似问题的一个问题涉及到了json jquery请求,尝试从您的json响应中删除周围的()最近的一个问题

有趣的是,我曾经遇到过类似的问题,通过添加周围的括号来解决。 - Amy B
@Coronatus 是的,这是我通常所做的,但是jquery 1.4.2开始依赖于浏览器的JSON.parse,我的firefox的JSON.parse可以成功解析{"key":"value"},但在({"key":"value"})上会出现错误。 - aularon
为了解决不同浏览器解析JSON的差异,我建议使用Douglas Crockford的解析器:http://www.json.org/json2.js - Chris Laplante

2
我能想到的一些事情:
  1. 确保通过设置cache: false禁用了缓存。
  2. 如果您使用的是Firefox,请尝试使用Firebug和Net选项卡来监视请求。
  3. 不要依赖于浏览器的JSON解析器。我建议使用这个:由JSON创始人开发的https://github.com/douglascrockford/JSON-js/blob/master/json2.js

1
“平凡和显而易见” - 好吧,那只是太苛刻了。 :) - Chris Laplante
抱歉如果话说得有点重了。已经给你加分了,因为提到了JSON解析器这个东西。 :) - simplyharsh
不要依赖于浏览器的JSON解析器?为什么?现在还是这样吗? - mfadel
1
@mfadel:一些旧版浏览器不支持JSON,因此在第一时间使用第三方解析器可以避免兼容性问题。 - Chris Laplante

1

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


-1

dataTypeplain/text修改为html


...但是 OP 甚至没有纯文本数据类型。 - eis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接