Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 为什么$.getJSON会自动失败?_Jquery_Json_Error Handling_Silent - Fatal编程技术网

Jquery 为什么$.getJSON会自动失败?

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都是 已拒绝,并引发分

当返回的数据不是有效的JSON时,jQuery的静默失败似乎非常不方便。为什么在执行时会出现无声的失败?使用更好的故障行为(例如,抛出异常、
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:use
fail(函数(d,textStatus,error).
我刚刚编辑了答案。如果这是一个与CORS相关的问题(就像我的问题一样)您将得到textStatus='error'和error='',因此我将其称为设计中的JSON失败。在这种情况下,它应该向开发人员报告一些情况。为我的服务器端添加与CORS相关的响应头修复了此问题,并立即允许我的客户端现在看到返回的正确JSON。the.success()、.error()和.complete()从jQuery1.8开始,jQuery1.5中引入的回调方法就被弃用了。