如何捕获 Ajax 查询发布错误?

Posted

技术标签:

【中文标题】如何捕获 Ajax 查询发布错误?【英文标题】:How do I catch an Ajax query post error? 【发布时间】: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 错误并在失败时显示相应的消息?

【问题讨论】:

【参考方案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 文档中!!! api.jquery.com/deferred.fail , api.jquery.com/deferred.done 用于文档 顺便还有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);
  
);

【讨论】:

以上是关于如何捕获 Ajax 查询发布错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何捕获 jQuery AJAX 错误?

使用 JSONP 时如何捕获 jQuery $.getJSON(或数据类型设置为“jsonp”的 $.ajax)错误?

JQuery $.ajax 捕获异常信息

使用带有 JSONP 的 AJAX 未捕获的 SyntaxError 和 CORS 错误

如何在 ajax 调用成功中访问 jquery 对象 - 未捕获的错误:SYNTAX_ERR:DOM Exception 12

如何修复“未捕获的错误:查询不再有模拟响应”