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


209

如果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错误并在失败时显示相应的消息?

Answers:


304

从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");
  }
});

14
@Yuck $ .post可以接受使用延迟对象的错误回调。请看下面我的答案作为示例。
Michael Venable 2012年

2
另外,让我$.ajax更具可读性的方法是为您使用哈希data。例如:{ name : 'John', location: 'Boston' }
briangonzalez

3
上面的成功和错误回调是过时,因为jQuery的1.8 api.jquery.com/jQuery.post
秃子

@MichaelVeneble我认为您可以使用$.post().error()
clintgh 2014年

288

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


3
+1非常好,但是仍然不喜欢语法。希望它在将来的版本中变得统一。
Yuck

25
这应该是公认的答案。当前接受的答案是“使用其他方法”;这个答案说“这是使您的方法起作用的方法”。后者通常是SO的首选。实际上,这应该包含在$ .post文档中!!!
Mark E. Haase 2013年


顺便说一下,还有一个responseJSON属性,如果使用ajax类型,它也非常方便json
ivkremer

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

15
$.post('someUri', { }, 
  function(data){ doSomeStuff })
 .fail(function(error) { alert(error.responseJSON) });

5
在此处添加更多说明将对将来的读者有所帮助。
埃里克·布朗

13

一种简单的方法是实现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
+1 -我想补充一点,这个处理程序获取几个参数,这样就可以显示实际的错误,响应代码,URL等
尼克Craver

请注意,从jQuery 1.8开始,.ajaxError()方法仅应附加到文档。
Nanki 2015年

0

您必须记录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'] );
})

0

您将.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 );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.