为啥 $.getJSON 静默失败?

Posted

技术标签:

【中文标题】为啥 $.getJSON 静默失败?【英文标题】:Why does $.getJSON silently fail?为什么 $.getJSON 静默失败? 【发布时间】:2011-07-26 10:58:02 【问题描述】:

当返回的数据不是有效的 JSON 时,jQuery 的 $.getJSON 静默失败似乎很不方便。为什么这是以静默失败的方式实现的?以更好的失败行为执行 getJSON 的最简单方法是什么(例如抛出异常、console.log() 或其他)?

【问题讨论】:

虽然为我的问题提供了足够的答案,但我仍然感到困惑的是,开发人员会将静默失败编程到 $.getJSON...wtf jQuery 家伙? 这是因为 jQuery 。在 JS 没有合适的调试工具,甚至是一个可以登录的控制台之前,每次失败要么是静默的,要么是添加到页面中,要么是显示在 alert() 中。抛出异常会停止代码,并阻止客户端代码稍后进行任何可能的恢复;除非开发人员将所有第 3 方代码都包装在 try-catch 块中。 【参考方案1】:

你可以使用

        function name() 
            $.getJSON("", function(d) 
                alert("success");
            ).done(function(d) 
                alert("done");
            ).fail(function(d) 
                alert("error");
            ).always(function(d) 
                alert("complete");
            );
        

如果要查看错误原因,请使用完整版

function name() 
    $.getJSON("", function(d) 
        alert("success");
    ).fail( function(d, textStatus, error) 
        console.error("getJSON failed, status: " + textStatus + ", error: "+error)
    );

如果您的 JSON 格式不正确,您会看到类似

getJSON failed, status: parsererror, error: SyntaxError: JSON Parse error: Unrecognized token '/'

如果网址错误,您会看到类似

getJSON failed, status: error, error: Not Found

如果您尝试从另一个域获取 JSON,违反了Same-origin policy,此方法会返回一条空消息。请注意,您可以使用 JSONP(其为 limitations)或跨域资源共享的首选方法 (CORS) 来解决同源策略。

【讨论】:

请注意 .error 已被弃用 - 最好使用 .fail 代替:api.jquery.com/jQuery.ajax 为什么要使用这个?而不是ajax?虽然这是 ajax 方法的包装,对吗?所以基本上当你想处理所有这些“状态”时使用 Ajax 会更好。你怎么看? @superluminary: 使用fail(function(d, textStatus, error)... 我刚刚编辑了答案。 如果这是一个与 CORS 相关的问题(就像我的问题一样),您将得到 textStatus='error' 和 error='' 所以我在设计。在这种情况下,它应该向开发人员报告一些内容。为我的服务器端添加与 CORS 相关的响应标头解决了此问题,并立即允许我的客户端现在看到返回的正确 JSON。【参考方案2】:

直接来自文档:

重要提示:从 jQuery 1.4 开始,如果 JSON 文件包含语法错误,请求通常会静默失败。

正如文档页面所说,getJSON 只是一种简写方法

$.ajax(
    url: url,
    dataType: 'json',
    data: data,
    success: callback
);

要获得失败行为,您可以像这样使用 $.ajax:

$.ajax(
    url: url,
    dataType: 'json',
    data: data,
    success: callback,
    error: another callback
);

【讨论】:

+1 简写 $.getJSON 很方便,但不够灵活,无法真正有用。 /叹气。 文档很清楚,但这并不能解释 为什么 它会默默地失败。默认情况下,负责将字符串解析为 javascript 对象的层对错误保持沉默的原因是什么? 简写对于新的 Promise 语法很有用 $.getJSON(...).error(function() ...)【参考方案3】:

您可以改用$.ajax,并将dataType 选项设置为“json”。来自文档:

“json”:将响应评估为 JSON 并返回一个 JavaScript 对象。在 jQuery 1.4 解析 JSON 数据 严谨的态度;任何格式错误的 JSON 都是 被拒绝并引发解析错误。 (有关更多信息,请参见 json.org 正确的 JSON 格式。)

【讨论】:

+1 显然,$.ajax 也捕获了解析错误并将有关它的信息发送到 error 回调,如 Håvard 所述。【参考方案4】:

您应该查看此 API 的文档...上面有一个 .error。

http://api.jquery.com/jQuery.getJSON/

【讨论】:

jQuery 1.5 中引入的 .success()、.error() 和 .complete() 回调方法自 jQuery 1.8 起已弃用。【参考方案5】:

如果您请求 JSONP 作为响应,如果没有响应(例如网络中断),您将收到静默失败。详情请见this thread。

【讨论】:

以上是关于为啥 $.getJSON 静默失败?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 $.getJSON 工作但不执行 onsuccess 部分?

getJSON 请求失败

$.getJson 失败,尽管 weatherapp 链接正常工作

Ajax和getjson为啥在ie浏览器不同版本中显示不同的数据

jQuery中的getJSON方法的url参数中,为啥加上callback=

嵌套 $.getJSON 的范围问题