204

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

4

9 回答 9

288

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

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

您可以通过两种方式处理错误:一般(通过在实际调用之前配置 AJAX 调用)或具体(使用方法链)。

“通用”将类似于:

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

和“特定”的方式:

$.getJSON("example.json", function() {
  alert("success");
})
.done(function() { alert("second success"); })
.fail(function() { alert("error"); })
.always(function() { alert("complete"); });
于 2011-04-05T14:29:51.453 回答
89

有人给卢西亚诺这些点:)我刚刚测试了他的答案——有一个类似的问题——并且工作得很好……

我什至加上我的 50 美分:

.error(function(jqXHR, textStatus, errorThrown) {
        console.log("error " + textStatus);
        console.log("incoming Text " + jqXHR.responseText);
    })
于 2011-09-14T17:59:08.663 回答
79

这是我的补充。

来自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!'); });

并带有错误描述以及将所有 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!'); });
于 2013-09-29T07:40:47.533 回答
12

我知道已经有一段时间没有人在这里回答了,发帖人可能已经从这里或其他地方得到了他的回答。然而,我确实认为这篇文章将帮助任何人在执行 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 数据,以及成功函数作为处理数据的函数.

但是,您可以在成功函数中添加状态和 xhr 变量。status 变量包含以下字符串之一:“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");
    }         
});

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

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

于 2013-11-28T02:54:06.703 回答
4

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

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

于 2016-01-24T22:29:29.163 回答
2

为什么不

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

是可能的。

于 2015-10-14T19:09:31.160 回答
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
    }
});
于 2012-12-21T17:14:44.173 回答
0

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

例如:

function obterJson(callback) {


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

    setTimeout(function(){
        callback(data);
    },0);
}
于 2015-07-07T14:02:03.113 回答
0

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

  • 您不再需要切换到 $.ajax 来传递您的不记名令牌
  • 使用 .then() 确保您可以同步处理任何结果(我遇到这个问题.always() 回调触发太快了- 尽管我不确定这是 100% 正确)
  • 我正在使用 .always() 来简单地显示结果是积极的还是消极的
  • 在 .always() 函数中,我使用 HTTP 状态代码和消息正文更新两个目标

代码片段是:

    $.getJSON({
         url: "https://myurl.com/api",
         headers: { "Authorization": "Bearer " + user.access_token}
    }).then().always(   function (data, textStatus) {
        $("#txtAPIStatus").html(data.status);
        $("#txtAPIValue").html(data.responseText);
    });
于 2020-07-08T20:41:40.523 回答