Как я могу получить сообщение об ошибке запроса Ajax?

Я хотел бы поймать ошибку и показать соответствующее сообщение, если запрос 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" никогда не выполняется, когда запрос Ajax не удался.

Как обработать ошибку Ajax и показать соответствующее сообщение, если оно не выполнено?

Ответ 1

Так как 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");
  }
});

Ответ 2

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 называлась success, а fail называлась error.

Ответ 3

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

Ответ 4

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

Ответ 5

Простым способом является реализация 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.');
  }
});

Ответ 6

Я исправил эту проблему, объявив datatype: 'json' в моем jQuery ajax-вызове.

Ответ 7

Вы должны войти в текст ответа:

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