Jquery 为什么$.getJSON会自动失败?
当返回的数据不是有效的JSON时,jQuery的静默失败似乎非常不方便。为什么在执行时会出现无声的失败?使用更好的故障行为(例如,抛出异常、Jquery 为什么$.getJSON会自动失败?,jquery,json,error-handling,silent,Jquery,Json,Error Handling,Silent,当返回的数据不是有效的JSON时,jQuery的静默失败似乎非常不方便。为什么在执行时会出现无声的失败?使用更好的故障行为(例如,抛出异常、console.log()或其他什么)执行getJSON的最简单方法是什么?您应该看看此API的文档。。。它有一个.错误 您可以改为使用,并将数据类型选项设置为“json”。从文件中: “json”:将响应计算为json 并返回一个JavaScript对象。在里面 jQuery 1.4 JSON数据在 严格的态度;任何格式错误的JSON都是 已拒绝,并引发分
console.log()
或其他什么)执行getJSON的最简单方法是什么?您应该看看此API的文档。。。它有一个.错误
您可以改为使用,并将数据类型
选项设置为“json”。从文件中:
“json”:将响应计算为json
并返回一个JavaScript对象。在里面
jQuery 1.4 JSON数据在
严格的态度;任何格式错误的JSON都是
已拒绝,并引发分析错误。
(请参见json.org了解更多关于
正确的JSON格式。)
直接从文档中: 重要提示:从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
});
你可以用
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
如果URL错误,您将看到如下内容
getJSON failed, status: parsererror, error: SyntaxError: JSON Parse error: Unrecognized token '/'
getJSON failed, status: error, error: Not Found
如果您试图从另一个域获取JSON,违反了,此方法将返回一条空消息。请注意,您可以通过使用JSONP(有JSONP)或跨源资源共享的首选方法()来处理同一源策略。如果您请求JSONP作为响应,如果没有响应(例如网络中断),您将得到一个无声的失败。有关详细信息,请参见。+1速记
$。getJSON
很方便,但不够灵活,无法真正发挥作用/叹气。文档很清楚,但这并不能解释为什么它会默默地失败。负责将字符串解析为JavaScript对象的层在默认情况下对错误保持沉默的基本原理是什么?对于新的promise语法$.getJSON(…).error(function(){…}),速记很有用
+1显然$。正如Håvard所提到的,ajax
还捕获解析错误,并将有关它的信息发送到错误
回调。虽然为我的问题提供了充分的答案,但我仍然感到困惑的是,开发人员会将无声故障编程为$。getJSON
…wtf jQuery家伙?这是因为jQuery已经过时了。在JS拥有合适的调试工具,甚至可以登录到控制台之前,每一个故障要么是无声的,要么添加到页面中,要么显示在警报()
中。抛出异常会使代码停止,并阻止客户端代码稍后进行任何可能的恢复;除非开发人员将第三方代码的每一位都包装在一个try-catch块中。请注意,.error是不推荐使用的-最好使用。fail:为什么要使用它?而不是ajax?虽然这是一个针对ajax的包装方法,对吗?因此,当您想要处理所有这些“状态”时,基本上最好使用Ajax。。你怎么看?@superluminary:usefail(函数(d,textStatus,error).
我刚刚编辑了答案。如果这是一个与CORS相关的问题(就像我的问题一样)您将得到textStatus='error'和error='',因此我将其称为设计中的JSON失败。在这种情况下,它应该向开发人员报告一些情况。为我的服务器端添加与CORS相关的响应头修复了此问题,并立即允许我的客户端现在看到返回的正确JSON。the.success()、.error()和.complete()从jQuery1.8开始,jQuery1.5中引入的回调方法就被弃用了。