【问题标题】:Error handling in getJSON callsgetJSON 调用中的错误处理
【发布时间】:2010-12-16 22:45:20
【问题描述】:

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

【问题讨论】:

标签: jquery cross-domain jsonp getjson


【解决方案1】:

$.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");
})
.done(function() { alert("second success"); })
.fail(function() { alert("error"); })
.always(function() { alert("complete"); });

【讨论】:

  • 不!你可以去那里。查看文档以获得更详细的帮助:http://api.jquery.com/jQuery.ajax
  • 请注意,这需要 jQuery 1.5+(试图让它与 jQuery 1.3 一起工作,并想知道为什么它抱怨方法无效:-)
  • OP 专门询问跨站点JSONP 似乎getJSON 在这种情况下不会调用error() 函数。我有同样的问题。我想这与JSONP 的处理方式与jQuery 中的普通AJAX 调用完全不同有关,尽管getJSON 处理两者。 JSON 是通过 XMLHTTPRequest 对象完成的,但 JSONP 是通过将 <script> 标记动态添加到页面的 HEAD 来完成的。
  • jQuery 文档说“注意:跨域脚本和 JSONP 请求不调用此处理程序。” api.jquery.com/jQuery.ajax > 错误
  • "jQuery 1.5 中引入的 jqXHR.success()、jqXHR.error() 和 jqXHR.complete() 回调方法在 jQuery 1.8 中已被弃用。要为最终删除它们做好准备,请改用 jqXHR.done()、jqXHR.fail() 和 jqXHR.always()。"
【解决方案2】:

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

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

代码sn-p是:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      为什么不

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

      是可能的。

      【讨论】:

        【解决方案5】:

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

        例如:

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

        【讨论】:

          【解决方案6】:

          我知道已经有一段时间没有人在这里回答了,发帖人可能已经从这里或其他地方得到了他的回答。然而,我确实认为这篇文章将帮助任何寻找在执行 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 对象 (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");
              }         
          });
          

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

          希望这对仍在寻找这个问题的答案的人有所帮助。

          【讨论】:

          • 这不起作用。顾名思义,“成功”回调仅在成功时调用。 (所以我不确定“status”参数的用途......)
          【解决方案7】:

          这是我的补充。

          来自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 的更新代码 sn-p:

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

          【讨论】:

          • done、fail、always和getJSON里面的代码的时间顺序是什么?
          • 注意:console.log 在旧版浏览器中没有像 IE7 那样实现!以防万一你使用它!
          【解决方案8】:

          我也遇到了同样的问题,但我没有为失败的请求创建回调,而是简单地返回了 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
              }
          });
          

          【讨论】:

          • 这对于服务器内发生的错误很好,但它不会捕获调用无法到达服务器或在它到达服务器代码之前抛出错误,例如如果MVC 用户不再经过身份验证。
          【解决方案9】:

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

          我什至加上我的 50 美分:

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

          【讨论】:

          • 这是跨站点 JSONP 还是同站点 JSON?
          • 不错的答案!只是关于 .error 的说明:它将在 jQuery 1.8 中弃用,因此请使用 .fail
          猜你喜欢
          • 2011-07-20
          • 1970-01-01
          • 2011-05-26
          • 1970-01-01
          • 2013-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-02
          相关资源
          最近更新 更多