关于jquery:getJSON调用中的错误处理

Error handling in getJSON calls

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


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

1
2
3
4
5
6
$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

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

"通用"将类似于:

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

以及"特定"方式:

1
2
3
4
5
6
$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });


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

我什至加上我的50美分:

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


这是我的补充。

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

"该jqXHR.success(),jqXHR.error(),和jqXHR.complete()回调
从jQuery 1.8开始不推荐使用jQuery 1.5中引入的方法。至
准备好将其删除的代码,请使用jqXHR.done(),
jqXHR.fail()和jqXHR.always()代替。"

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

1
2
3
4
5
6
$.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数据作为一个字符串:

1
2
3
4
5
6
$.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代替它们

1
2
3
4
5
6
$.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请求时跟踪错误和超时的方法的人有所帮助。因此,在我对问题的回答之下

getJSON结构如下(可在http://api.jqueri.com上找到):

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

大多数人使用

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

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

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

1
2
3
4
5
6
7
8
9
10
11
$.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");
    }        
});

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

希望这可以帮助别人还在寻找一个回答这个问题。


1
2
3
4
5
$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })

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


为什么不

1
2
3
4
5
6
7
8
9
10
11
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由该函数返回,因此像

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

是可能的。


我面临着同样的问题,但而不是一个失败的请求创建回调,我只是用JSON数据对象返回一个错误。

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

1
2
3
4
5
6
7
8
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;

1
2
3
4
5
6
7
8
9
10
11
$.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
    }
});


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

例如:

1
2
3
4
5
6
7
8
9
function obterJson(callback) {


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

    setTimeout(function(){
        callback(data);
    },0);
}