【问题标题】:AJAX doesn't pick up errorAJAX 不拾取错误
【发布时间】:2025-12-01 18:20:05
【问题描述】:

我对 JSON、JS 和 AJAX 完全陌生。我使用了一些示例代码来完成我的目标。我不明白的是,当 JSON 是一个错误对象时,成功部分仍在触发。当错误为真时,控制台显示对象 d 为空或非对象的错误。我做错了什么? TIA

结果类型好:

JSON: {"data":["1","breast","2","wing","3","thigh","4","leg","5","half","6","quarter white","7","quarter dark","9","whole"],"error":false}

结果类型错误:

JSON: {"error":true}

$.ajax({
            type     : 'GET',
            url      : 'getsubtypes2.php',
            data     : dataString,
            dataType : 'JSON',
            cache: false,
            success  : function(data) {          
                var output;            
                var d = data.data;
                    var output = "";
                    for (var i = 0 ; i< d.length; i=i+2) {//error gets to this line
                      var count = d[i];
                      var newOption = d[i+1];
                      output += "<option value='"+count+"'>"+newOption+"</option>";
                    }
                    $('#select3').empty().append(output); 
            },
            error: function(){
            $('#select3').empty();
                    console.log("Ajax failed");
            }
        });

【问题讨论】:

  • 只有当它们是真正的 http 错误时才会触发。您应该在成功方法中添加对该属性的检查。 if(data.error) { // 抛出 }

标签: javascript jquery json ajax


【解决方案1】:

服务器必须返回一个错误状态码,例如 4xx 或 5xx 才能执行错误回调。如果您的服务器返回 2xx,将执行成功回调。

对于测试,您可以尝试显式发送错误代码以查看 error 回调的执行情况。看到这个question

【讨论】:

    【解决方案2】:

    JQuery 的$.ajax() 例程依赖 HTTP 响应代码来检测错误。如果服务返回 200,即使在错误情况下(某些服务确实会发生),也可能发生这种情况。

    尝试检查调试器中的网络面板,了解服务真正返回的内容。

    【讨论】:

      【解决方案3】:

      正如建议的那样,这会正确地发现错误

      $.ajax({
                  type     : 'GET',
                  url      : 'getsubtypes2.php',
                  data     : dataString,
                  dataType : 'JSON',
                  cache: false,
                  success  : function(data) {          
                      var output;            
                      var d = data.data;
                      var e = data.error;
                  if(e) {
                       $('#select3').empty();
                  }
                  else {
                  var output = "";
                          for (var i = 0 ; i< d.length; i=i+2) {
                            var count = d[i];
                            var newOption = d[i+1];
                            output += "<option value='"+count+"'>"+newOption+"</option>";
                          }
                          $('#select3').empty().append(output); 
                      }
                  },
                  error: function(){
                  console.log("Ajax failed");
                  }
              }); 
      

      【讨论】:

      • 您是否有权访问服务器响应?如果你这样做了,为什么不发送一个 HTTP 错误代码来指示发生了错误?这将有助于确保如果您曾经切换到任何其他前端技术,将有效地检测到错误。