【问题标题】:How do I catch an Ajax query post error?如何捕获 Ajax 查询发布错误?
【发布时间】:2011-02-19 12:12:38
【问题描述】:

如果 Ajax 请求失败,我想捕获错误并显示相应的消息。

我的代码如下所示,但我无法捕获失败的 Ajax 请求。

function getAjaxData(id)
{
     $.post("status.ajax.php", {deviceId : id}, function(data){

        var tab1;

        if (data.length>0) {
            tab1 = data;
        }
        else {
            tab1 = "Error in Ajax";
        }

        return tab1;
    });
}

我发现,当 Ajax 请求失败时,“Error in Ajax”永远不会执行。

如何处理 Ajax 错误并在失败时显示相应的消息?

【问题讨论】:

    标签: jquery ajax post error-handling


    【解决方案1】:

    如果你想使用 .then() which has a subtle difference in comparison with .done()

    return $.post(url, payload)
    .then(
        function (result, textStatus, jqXHR) {
            return result;
        },
        function (jqXHR, textStatus, errorThrown) {
            return console.error(errorThrown);
        });
    

    【讨论】:

      【解决方案2】:

      您将 .onerror 处理程序附加到 ajax 对象,为什么当 vanila 跨平台工作时人们坚持发布 JQuery 以获得响应...

      快速示例:

      ajax = new XMLHttpRequest();
      ajax.open( "POST", "/url/to/handler.php", true );
      ajax.onerror = function(){
          alert("Oops! Something went wrong...");
      }
      ajax.send(someWebFormToken );
      

      【讨论】:

        【解决方案3】:

        您必须记录 responseText:

        $.ajax({
            type: 'POST',
            url: 'status.ajax.php',
            data: {
            deviceId: id
          }
        })
        .done(
         function (data) {
          //your code
         }
        )
        .fail(function (data) {
              console.log( "Ajax failed: " + data['responseText'] );
        })
        

        【讨论】:

          【解决方案4】:

          一个简单的方法是实现ajaxError

          每当 Ajax 请求完成时 出现错误时,jQuery 会触发 ajaxError 事件。任何和所有处理程序 已经注册的 .ajaxError() 方法在执行 这次。

          例如:

          $('.log').ajaxError(function() {
            $(this).text('Triggered ajaxError handler.');
          });
          

          我建议阅读ajaxError 文档。它所做的不仅仅是上面演示的简单用例 - 主要是它的回调接受许多参数:

          $('.log').ajaxError(function(e, xhr, settings, exception) {
            if (settings.url == 'ajax/missing.html') {
              $(this).text('Triggered ajaxError handler.');
            }
          });
          

          【讨论】:

          • +1 - 我要补充一点,这个处理程序有几个参数,所以你可以显示实际的错误、响应代码、url等。
          • 请注意,从 jQuery 1.8 开始,.ajaxError() 方法只能附加到文档。
          【解决方案5】:

          从 jQuery 1.5 开始,您可以使用延迟对象机制:

          $.post('some.php', {name: 'John'})
              .done(function(msg){  })
              .fail(function(xhr, status, error) {
                  // error handling
              });
          

          另一种方法是使用.ajax

          $.ajax({
            type: "POST",
            url: "some.php",
            data: "name=John&location=Boston",
            success: function(msg){
                  alert( "Data Saved: " + msg );
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
               alert("some error");
            }
          });
          

          【讨论】:

          • @Yuck $.post 可以接受使用延迟对象的错误回调。请看下面我的答案作为示例。
          • 另外,让$.ajax 更具可读性的方法是为您的data 使用哈希。例如:{ name : 'John', location: 'Boston' }
          • 上述成功和错误回调在 jQuery 1.8 中已过时 api.jquery.com/jQuery.post
          • @MichaelVeneble 我想你可以使用$.post().error()
          【解决方案6】:
          $.post('someUri', { }, 
            function(data){ doSomeStuff })
           .fail(function(error) { alert(error.responseJSON) });
          

          【讨论】:

          • 在此处添加更多解释将对未来的读者有所帮助。
          【解决方案7】:

          jQuery 1.5 添加了延迟对象,可以很好地处理这个问题。只需调用$.post 并在调用后附加您想要的任何处理程序。延迟对象甚至允许您附加多个成功和错误处理程序。

          例子:

          $.post('status.ajax.php', {deviceId: id})
              .done( function(msg) { ... } )
              .fail( function(xhr, textStatus, errorThrown) {
                  alert(xhr.responseText);
              });
          

          在 jQuery 1.8 之前,函数 done 被称为 successfail 被称为 error

          【讨论】:

          • +1 非常好,但仍然对语法不感兴趣。希望它在未来的版本中得到统一。
          • 这应该是公认的答案。当前接受的答案是“使用不同的方法”;这个答案说“这是使您的方法起作用的方法”。后者通常是 SO 的首选。实际上,这应该包含在 $.post 文档中!!!
          • 顺便还有responseJSON属性,在ajax类型为json的情况下也很方便。
          • xhr.responseText 似乎是失败回调大海捞针中的一根针。但我建议将dataType: 'text' 添加到$.post 的第二个参数。 might 帮助引导不同内容类型的错误消息显示在 responseText 中。但我还没有检查。
          【解决方案8】:
          $.ajax({
            type: 'POST',
            url: 'status.ajax.php',
            data: {
               deviceId: id
            },
            success: function(data){
               // your code from above
            },
            error: function(xhr, textStatus, error){
                console.log(xhr.statusText);
                console.log(textStatus);
                console.log(error);
            }
          });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-09-22
            • 2016-10-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-24
            • 1970-01-01
            • 2020-07-22
            相关资源
            最近更新 更多