getJSON调用中的错误处理


191

如何处理getJSON调用中的错误?我正在尝试使用jsonp引用跨域脚本服务,如何注册错误方法?



阿杰,为什么不考虑标记正确答案呢?
尼卡比曹

@IonicăBizău标记了它。我刚刚对此一无所知。最重要的答案不是在谈论JSONP。正如Ben Shelock所指出的那样,我认为没有受支持的错误处理程序。–
Ajay

Answers:


277

$.getJSON() 是常规AJAX调用的一种抽象,您必须在其中告诉您需要JSON编码的响应。

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

您可以通过两种方式处理错误:一般(通过在实际调用之前配置AJAX调用)或专门(通过方法链)。

“通用”将类似于:

$.ajaxSetup({
      "error":function() { alert("error");  }
});

以及“特定”方式:

$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });

不行!您可以在那里随意走。查看文档以获取更多详细帮助:http
Luciano Costa

5
请注意,这需要jQuery 1.5+(试图使其与jQuery 1.3一起使用,并想知道为什么它抱怨无效方法:-)
kenyee 2011年

24
在这种情况下,OP JSONP似乎getJSON没有专门询问跨站点问题error()。我有同样的问题。我想这是与如何做JSONP的处理完全不同,以正常AJAX的通话jQuery,尽管getJSON同时处理。JSON是通过XMLHTTPRequest对象完成的,但是JSONP可以通过向<script>页面的动态添加标签来完成HEAD
hippietrail

3
jQuery Doc表示“注意:跨域脚本和JSONP请求不会调用此处理程序。” api.jquery.com/jQuery.ajax >错误
OneWorld

10
“从jQuery 1.8开始,jQuery 1.5中不推荐使用jqXHR.success(),jqXHR.error()和jqXHR.complete()回调方法。要准备将其最终删除,请使用jqXHR.done(),jqXHR .fail()和jqXHR.always()代替。”
SkorunkaFrantišek'16

85

有人给卢西亚诺这些要点:)我刚刚测试了他的答案-遇到了类似的问题-并且运行良好...

我什至加上我的50美分:

.error(function(jqXHR, textStatus, errorThrown) {
        console.log("error " + textStatus);
        console.log("incoming Text " + jqXHR.responseText);
    })

3
这是跨站点JSONP还是同一站点JSON?
hippietrail

28
好答案!只是有关.error的注释:它将在jQuery 1.8中弃用,因此请使用.fail
Anatoly Mironov

72

这是我的补充。

来自http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.html官方资源

jQuery 1.5中已弃用了jQuery 1.5中引入的jqXHR.success(),jqXHR.error()和jqXHR.complete()回调方法。要准备将其最终删除,请使用jqXHR.done(),jqXHR .fail()和jqXHR.always()代替。

我做到了,这是Luciano的更新代码段:

$.getJSON("example.json", function() {
  alert("success");
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function() { alert('getJSON request failed! '); })
.always(function() { alert('getJSON request ended!'); });

并带有错误描述以及将所有json数据显示为字符串:

$.getJSON("example.json", function(data) {
  alert(JSON.stringify(data));
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
.always(function() { alert('getJSON request ended!'); });

如果您不喜欢警报,则将其替换为 console.log

$.getJSON("example.json", function(data) {
  console.log(JSON.stringify(data));
})
.done(function() { console.log('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { console.log('getJSON request failed! ' + textStatus); })
.always(function() { console.log('getJSON request ended!'); });

完成,失败,始​​终和getJSON中的代码的时间顺序是什么?
TheLogicGuy

注意:console.log在旧版浏览器中未实现为IE7!以防万一您使用它!
MadMad666

12

我知道已经有一段时间了,因为有人在这里回答,而发帖人可能已经从这里或其他地方得到了他的答案。但是,我确实认为,这篇文章将对任何寻求在执行getJSON请求时跟踪错误和超时的方法的人有所帮助。因此,在我对问题的回答之下

getJSON结构如下(位于http://api.jqueri.com上):

$(selector).getJSON(url,data,success(data,status,xhr))

大多数人使用

$.getJSON(url, datatosend, function(data){
    //do something with the data
});

他们使用url var提供指向JSON数据的链接,而data则作为添加 "?callback=?"必须发送的变量和其他变量以获取正确的JSON数据的位置,并将成功函数用作处理数据的函数。

但是,您可以在成功函数中添加status和xhr变量。状态变量包含以下字符串之一:“成功”,“未修改”,“错误”,“超时”或“ parsererror”,而xhr变量包含返回的XMLHttpRequest对象(在w3schools上找到

$.getJSON(url, datatosend, function(data, status, xhr){
    if (status == "success"){
        //do something with the data
    }else if (status == "timeout"){
        alert("Something is wrong with the connection");
    }else if (status == "error" || status == "parsererror" ){
        alert("An error occured");
    }else{
        alert("datatosend did not change");
    }         
});

这样,就很容易跟踪超时和错误,而无需实现在请求完成后启动的自定义超时跟踪器。

希望这可以帮助仍在寻找该问题答案的人。


2
这行不通。顾名思义,“成功”回调仅在成功时调用。(因此,我不确定“ status”参数适用于什么...)
jwelsh 2015年

4

$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })

它在jQuery 2.x中已修复;在jQuery 1.x中,您永远不会收到错误回调


1

我遇到了同样的问题,但是我没有为失败的请求创建回调,而是直接返回了json数据对象的错误。

如果可能,这似乎是最简单的解决方案。这是我使用的Python代码的示例。(使用Flask,Flask的jsonify f和SQLAlchemy)

try:
    snip = Snip.query.filter_by(user_id=current_user.get_id(), id=snip_id).first()
    db.session.delete(snip)
    db.session.commit()
    return jsonify(success=True)
except Exception, e:
    logging.debug(e)
    return jsonify(error="Sorry, we couldn't delete that clip.")

然后,您可以像这样检查Javascript;

$.getJSON('/ajax/deleteSnip/' + data_id,
    function(data){
    console.log(data);
    if (data.success === true) {
       console.log("successfully deleted snip");
       $('.snippet[data-id="' + data_id + '"]').slideUp();
    }
    else {
       //only shows if the data object was returned
    }
});

这对于服务器内发生的错误很好,但是当呼叫无法到达服务器时或在未达到服务器代码之前抛出错误时(例如,不再对MVC用户进行身份验证),则无法捕获该错误。
Lee Oades

1

为什么不

getJSON('get.php',{cmd:"1", typeID:$('#typesSelect')},function(data) {
    // ...
});

function getJSON(url,params,callback) {
    return $.getJSON(url,params,callback)
        .fail(function(jqXMLHttpRequest,textStatus,errorThrown) {
            console.dir(jqXMLHttpRequest);
            alert('Ajax data request failed: "'+textStatus+':'+errorThrown+'" - see javascript console for details.');
        })
}

??

有关所用.fail()方法(jQuery 1.5+)的详细信息,请参见http://api.jquery.com/jQuery.ajax/#jqXHR

由于jqXHR函式是由函式传回,因此像

$.when(getJSON(...)).then(function() { ... });

是可能的。


0

在某些情况下,您可能会遇到与此方法同步的问题。我在里面写了回调调用setTimeout函数,并且它同步工作就好了=)

例如:

function obterJson(callback) {


    jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) {

    setTimeout(function(){
        callback(data);
    },0);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.