Як я можу виявити помилку повідомлення 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 і показую відповідне повідомлення, якщо воно не працює?

Відповіді:


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 може прийняти зворотний виклик помилок за допомогою відкладених об'єктів. Подивіться на приклад мою відповідь нижче.
Майкл Венебл

2
Крім того, я можу зробити $.ajaxбільш зрозумілим - використовувати хеш для вашого data. Наприклад:{ name : 'John', location: 'Boston' }
briangonzalez

3
Звернення викликів успіху та помилок є застарілими станом на jQuery 1.8 api.jquery.com/jQuery.post
Baldy

@MichaelVeneble Я думаю, ви можете використовувати$.post().error()
clintgh

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 !!!
Марк Е. Хааз


До речі, є також responseJSONмайно, яке також дуже зручно у випадку типу аякса 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 тощо.
Нік Крейвер

Зауважте, що, починаючи з jQuery 1.8, метод .ajaxError () повинен бути доданий лише до документа.
Нанки

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 для відповідей, коли ваніла працює між платформою ...

Приклад швидкого доступу:

ajax = new XMLHttpRequest();
ajax.open( "POST", "/url/to/handler.php", true );
ajax.onerror = function(){
    alert("Oops! Something went wrong...");
}
ajax.send(someWebFormToken );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.