为啥 $.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 失败,尽管 weatherapp 链接正常工作
Ajax和getjson为啥在ie浏览器不同版本中显示不同的数据