2009-11-16 119 views
165

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

+0

似乎是**的副本** [如何使用JSONP捕获jQuery $ .getJSON(或$ .ajax数据类型设置为'jsonp')错误? ](http://stackoverflow.com/questions/309953/how-do-i-catch-jquery-getjson-or-ajax-with-datatype-set-to-jsonp-error-w)** – hippietrail 2011-12-18 16:04:42

+0

Ajay,为什么没有考虑标记正确答案? – 2015-03-19 12:30:47

+0

@IonicăBizău现在标记。我刚刚失踪了一段时间。最重要的答案不是在谈论JSONP。正如Ben Shelock指出的那样,没有支持的错误处理程序是我相信的。如果使用.error(),您是否必须使用另外两个? – Ajay 2015-03-19 21:15:25

回答

7

似乎没有错误的方法从我读的hereThis answer提供了一个很好的解释

256

$.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"); }); 
+0

? – 2011-06-09 20:00:54

+0

不好意思!你可以像你那样去。看看文档的更详细的帮助:[http://api.jquery.com/jQuery.ajax](http://api.jquery.com/jQuery.ajax) – 2011-06-15 12:36:43

+4

请注意,这需要jQuery 1.5+(试图让它工作瓦特/ jQuery 1.3,并想知道为什么它抱怨无效的方法:-) – kenyee 2011-12-13 22:01:19

77

有人给卢西亚诺这些点:) 我只是测试他的回答-had类似问题和完美...

我甚至加我的50美分:

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

这是与跨网站JSONP还是与网站JSON相同? – hippietrail 2011-12-18 16:02:40

+24

好的答案!只需要注意.error:它会在jQuery 1.8中弃用,所以请使用[.fail](http://api.jquery.com/jQuery.ajax/) – 2012-07-03 06:41:29

+2

这节省了我的生命 – KJP 2013-05-08 18:00:27

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 
    } 
}); 
+0

这对于发生在服务器,但它不会捕获何时调用无法到达服务器,或者在它遇到服务器代码之前抛出错误,例如,如果MVC用户不再进行身份验证。 – 2017-01-13 14:02:32

54

这是我的补充。

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(),而不是

我做到了,这里是卢西亚诺的更新程式码:

$.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!'); }); 
+0

什么是完成,失败,总是和getJSON内的代码的时间顺序? – TheLogicGuy 2016-08-05 19:58:57

+0

注意:console.log没有在IE7的旧版浏览器中实现! 以防万一您使用它! – MadMad666 2017-06-28 20:38:09

9

替代他们,我知道它已经因为同时有人在这里回答,海报可能已经从这里或从其他地方得到了他的答案。不过,我认为这篇文章将帮助任何人寻找一种方法来在执行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数据的链接,用于添加"?callback=?"和必须发送的其他变量以获取返回的正确JSON数据的地方的datatosend,以及作为处理数据的函数的成功funcion。

但是,您可以在您的成功功能中添加status和xhr变量。状态变量包含以下字符串之一:“成功”,“notmodified”,“错误”,“超时”,或“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"); 
    }   
}); 

这种方式很容易跟踪超时和错误,而无需实现一旦请求完成就启动的自定义超时跟踪器。

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

+2

这不起作用。顾名思义,“成功”回调仅在成功时才被调用。 (所以我不确定什么“状态”参数是...) – jwelsh 2015-06-26 18:06:58

0

在某些情况下,您可能会遇到与此方法同步的问题。 我写了一个setTimeout函数内的回拨电话,和它的工作同步就好=)

E.G:

function obterJson(callback) { 


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

    setTimeout(function(){ 
     callback(data); 
    },0); 
} 
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

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

它被固定在jQuery的2.x的;在jQuery 1.x中,你永远不会得到一个错误回调