$ .ajax():responseText是正确的但报告错误。为什么?

时间:2012-06-22 03:51:04

标签: javascript jquery ruby-on-rails

我正试图从我的服务器中获取一些JSON数据,如下所示:

var a = $.ajax({
    url: "data.json",
    dataType: 'json',
    data: null,
    error: function(data) {
        console.log("error");
    },
    success: function(data) {
        console.log("success");
    }
});

执行此操作时,将调用error函数(error将打印到控制台)。

奇怪的是,当我检查a时,我发现已经返回了正确的响应文本。

a

readyState: 4
responseText: "contents of data.json!"
status: 200
statusText: "OK"

发生了什么事?如果请求成功,为什么不成功回调?

2 个答案:

答案 0 :(得分:4)

可能是因为返回的特定值不是您指定的类型。响应本身是成功的(正如您通过查看“a”的详细信息所看到的那样),但这不是决定是否执行成功或错误的唯一决定因素。您将json指定为“dataType”(返回类型),但收到了一个字符串。对于测试,那很好,但正如你所看到的,事情不会按预期运行。如果您没有指定dataType选项,jQuery将尝试通过查看mime类型和响应内容来确定返回的内容类型。当它们不匹配时(例如在你的情况下)它是一个错误。

更新:

我意识到我在上面的解释中絮絮叨叨。虽然你似乎解决了这个问题,但让我再详细说明一下。

在您的情况下,有几种错误可能发生。要理解的重要一点是,如果设置“dataType”,jQuery将尝试使用该类型解析responseText。如果您没有设置该选项,它将相应地猜测并解析它(这意味着它将查看MIME类型)并以这种方式解析它。如果指定“dataType”,则responseText需要采用JSON格式。因此,如果您指定“json”,但提供一个字符串(在您的情况下),jQuery解析失败。如果未指定“dataType”和jQuery猜测,则responseText需要与MIME类型匹配。因此,当MIME类型为“application / json”时,您无法返回字符串。当事情不匹配时,那就是错误发生的时候。

希望这有帮助!

答案 1 :(得分:1)

只是预感,但是要返回的内容类型" application / json"?我的预感是错误是JSON预计会回来,但它返回的是text / html(或其他一些内容类型),然后才被解析。