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

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

TTCG
источник

Ответы:

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");
  }
});
Choise
источник
14
@Yuck $ .post может принять сообщение об ошибке с использованием отложенных объектов. Посмотрите на мой ответ ниже для примера.
Майкл Венейбл
2
Кроме того, я могу сделать $.ajaxболее читабельным использование хеша для вашего data. Например:{ name : 'John', location: 'Boston' }
briangonzalez
@MichaelVeneble я думаю, что вы можете использовать$.post().error()
клинт
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вызывалась successи failвызывалась error.

Майкл Венейбл
источник
3
+1 Очень красиво, но все же не без ума от синтаксиса. Надеюсь, это будет унифицировано в будущем выпуске.
Фу
25
Это должен быть принятый ответ. Текущий принятый ответ - «использовать другой метод»; этот ответ говорит: «вот как заставить ваш метод работать». Последний обычно предпочтителен по SO. На самом деле, это должно быть включено в документацию $ .post !!!
Марк Э. Хааз
2
api.jquery.com/deferred.fail , api.jquery.com/deferred.done для документации
Deleplace
Кстати, есть также 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);
  }
});
JANDY
источник
15
$.post('someUri', { }, 
  function(data){ doSomeStuff })
 .fail(function(error) { alert(error.responseJSON) });
marknery
источник
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.');
  }
});
karim79
источник
1
+1 - я бы добавил, что этот обработчик получает несколько аргументов, поэтому вы можете отобразить фактическую ошибку, код ответа, URL и т. Д.
Ник Крейвер
Обратите внимание, что начиная с jQuery 1.8, метод .ajaxError () должен быть прикреплен только к документу.
Nanki
0

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

$.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, почему люди настаивают на публикации JQuery для ответов, когда vanila работает кроссплатформенно ...

быстрый пример:

ajax = new XMLHttpRequest();
ajax.open( "POST", "/url/to/handler.php", true );
ajax.onerror = function(){
    alert("Oops! Something went wrong...");
}
ajax.send(someWebFormToken );
Марк Гиблин
источник