getJSON调用中的错误处理

时间:2009-11-16 05:20:51

标签: jquery cross-domain jsonp getjson

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

9 个答案:

答案 0 :(得分:272)

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

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

您可以通过两种方式处理错误:通常(通过在实际调用它们之前配置AJAX调用)或特定方式(使用方法链)。

'generic'会是这样的:

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

以'特定'的方式:

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

答案 1 :(得分:81)

有人给Luciano这些要点:) 我刚刚测试了他的答案 - 这是一个类似的问题 - 而且工作得很完美......

我甚至加了50美分:

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

答案 2 :(得分:62)

这是我的补充。

来自http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.htmlthe official source

jqXHR.success(),jqXHR.error()和jqXHR.complete()回调 jQuery 1.5中引入的方法在jQuery 1.8中已弃用。至 为最终删除代码做好准备,使用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!'); });

答案 3 :(得分:11)

我知道已经有一段时间了,因为有人在这里回答,海报可能已经从这里或其他地方得到了答案。但我认为这篇文章将帮助任何人在执行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数据的链接,datatosend作为添加"?callback=?"的地方和其他必须发送的变量来获取返回的正确JSON数据,并且成功函数作为处理数据的函数。

但是,您可以在成功函数中添加status和xhr变量。状态变量包含以下字符串之一:“success”,“notmodified”,“error”,“timeout”或“parsererror”,xhr变量包含返回的XMLHttpRequest对象 (found on 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");
    }         
});

通过这种方式,可以轻松跟踪超时和错误,而无需实现请求完成后启动的自定义超时跟踪器。

希望这有助于某人仍在寻找这个问题的答案。

答案 4 :(得分:2)



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




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

答案 5 :(得分: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
    }
});

答案 6 :(得分: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() { ... });

是可能的。

答案 7 :(得分:0)

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

E.G:

function obterJson(callback) {


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

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

答案 8 :(得分:0)

这是一个很老的线程,但是它确实出现在Google搜索中,所以我想我会使用Promise添加一个jQuery 3答案。此代码段还显示:

  • 您不再需要切换到$ .ajax来传递承载令牌
  • 使用.then()来确保您可以同步处理任何结果(我遇到了这个问题.always() callback firing too soon-尽管我不确定那是100%正确)
  • 我正在使用.always()来简单地显示结果是正数还是负数
  • 在.always()函数中,我正在使用HTTP状态代码和消息正文更新两个目标

代码段为:

import pandas as pd

df = pd.read_csv('genderword_sk2.csv')

dictionary = {df['name'].iloc[i] : df['gender'].iloc[i] for i in df.index}