getJSON调用中的错误处理

Aja*_*jay 183 jquery jsonp cross-domain getjson

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

小智 274

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

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});
Run Code Online (Sandbox Code Playgroud)

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

'generic'会是这样的:

$.ajaxSetup({
      "error":function() { alert("error");  }
});
Run Code Online (Sandbox Code Playgroud)

而'具体'的方式:

$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });
Run Code Online (Sandbox Code Playgroud)

  • OP特别询问跨站点`JSONP`似乎`getJSON`在这种情况下不会调用`error()`函数.我遇到了同样的问题.我想这与`JSONP`的处理方式完全不同于`jQuery`中的普通`AJAX`调用,尽管`getJSON`处理两者.`JSON`是用`XMLHTTPRequest`对象完成的,但``JSONP`是通过动态地将`<script>`标签添加到页面的`HEAD`来完成的. (24认同)
  • "jQuery 1.5中引入的jqXHR.success(),jqXHR.error()和jqXHR.complete()回调方法在jQuery 1.8中已弃用.要准备代码以便最终删除,请使用jqXHR.done(),jqXHR .fail()和jqXHR.always()代替." (10认同)
  • 请注意,这需要jQuery 1.5+(试图让它与jQuery 1.3一起工作,并想知道它为什么抱怨无效方法:-) (5认同)
  • jQuery Doc说:"注意:不会为跨域脚本和JSONP请求调用此处理程序." http://api.jquery.com/jQuery.ajax/>错误 (3认同)

fre*_*tix 84

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

我甚至加了50美分:

.error(function(jqXHR, textStatus, errorThrown) {
        console.log("error " + textStatus);
        console.log("incoming Text " + jqXHR.responseText);
    })
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案!只是关于.error的说明:它将在jQuery 1.8中弃用,所以使用[.fail](http://api.jquery.com/jQuery.ajax/) (27认同)
  • 这是跨站点JSONP还是使用相同的站点JSON? (3认同)
  • 这救了我的命 (2认同)

use*_*737 65

这是我的补充.

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

" jQuery 1.5中引入的jqXHR.success(),jqXHR.error()和jqXHR.complete()回调方法在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!'); });
Run Code Online (Sandbox Code Playgroud)

并使用错误描述并将所有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!'); });
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢警报,请将其替换为 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!'); });
Run Code Online (Sandbox Code Playgroud)


小智 12

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

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

$(selector).getJSON(url,data,success(data,status,xhr))
Run Code Online (Sandbox Code Playgroud)

大多数人都使用它来实现

$.getJSON(url, datatosend, function(data){
    //do something with the data
});
Run Code Online (Sandbox Code Playgroud)

他们使用url var来提供JSON数据的链接,datatosend作为添加"?callback=?"必须发送的变量和其他变量的地方,以获取返回的正确JSON数据,以及成功函数作为处理数据的函数.

但是,您可以在成功函数中添加status和xhr变量.状态变量包含以下字符串之一:"success","notmodified","error","timeout"或"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");
    }         
});
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这不起作用.顾名思义,"成功"回调仅仅取决于成功.(所以我不确定"status"参数是什么...) (2认同)