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

137

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

Теги:
error-handling
post

6 ответов

175
Лучший ответ

Так как 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 может принять сообщение об ошибке с использованием отложенных объектов. Посмотрите на мой ответ ниже для примера.
  • 2
    Кроме того, я могу сделать $.ajax более читабельным, используя хеш для ваших data . Например: { name : 'John', location: 'Boston' }
Показать ещё 3 комментария
247

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
    +1 Очень красиво, но все же не без ума от синтаксиса. Надеюсь, это будет унифицировано в будущем выпуске.
  • 21
    Это должен быть принятый ответ. Текущий принятый ответ - «использовать другой метод»; Этот ответ говорит: «Вот как заставить ваш метод работать». Последний обычно предпочтителен по SO. На самом деле, это должно быть включено в документацию $ .post !!!
Показать ещё 2 комментария
78
$.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);
  }
});
12
$.post('someUri', { }, 
  function(data){ doSomeStuff })
 .fail(function(error) { alert(error.responseJSON) });
  • 3
    Добавление более подробного объяснения поможет будущим читателям.
  • 1
    Что делать, если у меня ошибка неопределена?
10

Простым способом является реализация 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 и т. Д.
  • 0
    @Nick - добавил, что в.
Показать ещё 2 комментария
1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню