在getJSON调用中处理错误

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

似乎没有错误的方法从我在这里阅读。 这个答案提供了很好的解释

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

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

您可以通过两种方式来处理错误:一般来说(通过在实际调用AJAX之前configuration您的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"); }); 

有人给卢西亚诺这些观点:)我刚刚testing了他的答案 – 有一个类似的问题,并完美地工作…

我甚至增加了我的50美分:

 .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和官方来源;

在jQuery 1.5中引入的jqXHR.success(),jqXHR.error()和jqXHR.complete()callback方法在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数据显示为一个string:

 $.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.logreplace它们

 $.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上find):;

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

大多数人实现使用

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

在那里他们使用URL var提供一个链接到JSON数据,datatosend作为添加"?callback=?" 和其他必须发送的variables来获取正确的JSON数据返回,以及作为函数处理数据的成功funcion。

然而,你可以在你的成功函数中添加status和xhrvariables。 statusvariables包含以下string之一:“success”,“notmodified”,“error”,“timeout”或“parsererror”,而xhrvariables包含返回的XMLHttpRequest对象( 可在w3schools上find )

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

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

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

我遇到了同样的问题,而不是创build一个失败的请求callback,我简单地返回与json数据对象的错误。

如果可能的话,这似乎是最简单的解决scheme。 以下是我使用的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 } }); 

为什么不

 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() { ... }); 

是可能的。

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

例如:

 function obterJson(callback) { jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) { setTimeout(function(){ callback(data); },0); } 
 $.getJSON("example.json", function() { alert("success"); }) .success(function() { alert("second success"); }) .error(function() { alert("error"); })