Функція помилки jQuery ajax


130

У мене є виклик Ajax, який передає дані на сторінку, яка потім повертає значення.

Я отримав успішний дзвінок зі сторінки, але я зашифрував його так, що він викликає помилку в asp. Як я можу отримати цю помилку з jquery?

Наприклад:

cache: false,
url: "addInterview_Code.asp",
type: "POST",
datatype: "text",
data: strData,
success: function (html) {
    alert('successful : ' + html);
    $("#result").html("Successful");
},
error: function (error) {
    **alert('error; ' + eval(error));**
}

Я не розумію біт помилок. У функції який параметр мені потрібно поставити, щоб потім я міг використовувати повідомлення про помилку, яке я підняв на сервері.


Там є друкарська помилка: це dataTypeне так datatype.
Алехандро Нава


7
@ alej27: формулювання є дивним, але це не говорить про те, що ви не можете використовувати їх обоє; він говорить, що запит не викликає успіх та помилку (тому що вони взаємовиключні).
Марті Ванс

Будьте уважні з відповідями тут. У jQuery 3.0 застаріле відмічено .errorта .successстає важливішим, оскільки вони були видалені.
Марк Шультейс

Відповіді:


221

Необхідні параметри errorфункції Ajax є, jqXHR, exceptionі ви можете використовувати її як нижче:

$.ajax({
    url: 'some_unknown_page.html',
    success: function (response) {
        $('#post').html(response.responseText);
    },
    error: function (jqXHR, exception) {
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    },
});

DEMO FIDDLE


Параметри

jqXHR:

Це власне об'єкт помилки, який виглядає приблизно так

Об'єкт помилки Ajax jqXHR

Ви також можете переглянути це на своїй консолі браузера, використовуючи console.logвнутрішню errorфункцію, наприклад:

error: function (jqXHR, exception) {
    console.log(jqXHR);
    // Your error handling logic here..
}

Ми використовуємо statusвластивість цього об’єкта, щоб отримати код помилки, наприклад, якщо ми отримуємо статус = 404, це означає, що запитувану сторінку не вдалося знайти. Він взагалі не існує. На основі цього коду статусу ми можемо перенаправляти користувачів на сторінку входу або будь-яку необхідну для нашої бізнес-логіки інформацію.

виняток:

Це рядкова змінна, яка показує тип виключення. Отже, якщо ми отримуємо помилку 404, exceptionтекст буде просто «помилкою». Так само ми можемо отримати "тайм-аут", "скасувати", як і інші тексти винятків.


Застарілі Примітка:jqXHR.success() , jqXHR.error()і jqXHR.complete()зворотні виклики є застарілим JQuery 1.8. Для того, щоб підготувати свій код для їх подальшого видалення, використовувати jqXHR.done(), jqXHR.fail()і jqXHR.always()замість цього.

Отже, у випадку, коли ви використовуєте jQuery 1.8 або вище, нам потрібно буде оновити логіку функції успіху та помилок, наприклад: -

// Assign handlers immediately after making the request,
// and remember the jqXHR object for this request
var jqxhr = $.ajax("some_unknown_page.html")
    .done(function (response) {
        // success logic here
        $('#post').html(response.responseText);
    })
    .fail(function (jqXHR, exception) {
        // Our error logic here
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    })
    .always(function () {
        alert("complete");
    });

Сподіваюся, це допомагає!


6
Цікаво, що не рекомендується використовувати ajaxSetup. Дивіться api.jquery.com/jquery.ajaxsetup
SleepyBoBos

1
@ palaѕn Я думаю, що ви неправильно прочитали повідомлення про депресію. Якщо ви помічаєте, повідомлення про депрекацію говорить про знецінення методів jqXHR, але використання успіху, помилки та завершення у вашому вище прикладі робиться в межах об'єкта методу $ .ajax. Це не застаріло, і вам не потрібно перемикати код. Однак, якщо ви віддаєте перевагу ланцюговим методам, тоді ви можете використовувати цей стиль. Коли я прочитав "депресію ..." це відкинуло мене (без причини). :-)
bchr02

Станом на jQuery 3.0 застаріле відмічено .errorта .successстає важливішим, оскільки вони були видалені
Марк Шультхейс

99

Спробуйте це:

error: function(jqXHR, textStatus, errorThrown) {
  console.log(textStatus, errorThrown);
}

Якщо ви хочете повідомити свій інтерфейс про помилку перевірки, спробуйте повернути json:

dataType: 'json',
success: function(data, textStatus, jqXHR) {
   console.log(data.error);
}

Ваш сценарій ASP може повернутися:

{"error": true}

1
Для чого призначений textSttaus та errorThrown? Поясніть, будь ласка,
Аннапурна

4

Ось як витягнути помилку asp.

              cache: false,
              url: "addInterview_Code.asp",
              type: "POST",
              datatype: "text",
              data: strData,
              success: function (html) {
                  alert('successful : ' + html);
                  $("#result").html("Successful");
              },
              error: function (jqXHR, textStatus, errorThrown) {
                  if (jqXHR.status == 500) {
                      alert('Internal error: ' + jqXHR.responseText);
                  } else {
                      alert('Unexpected error.');
                  }
              }

2
error(jqXHR, textStatus, errorThrown)

http://api.jquery.com/jQuery.ajax/


9
Будь ласка, надайте пояснення, а не лише фрагмент коду та посилання на документи.
Грег Дубіцький

12
Дякую за майже нічого.
Judasane

Наприклад, ви могли сказати: "OP використовує помилку функції (помилка), але jquery викликає помилку функції (jqXHR, textStatus, errorThrown). Зауважте, що у фрагменті ОП відсутні два параметри."
increddibelly

2
          cache: false,
          url: "addInterview_Code.asp",
          type: "POST",
          datatype: "text",
          data: strData,
          success: function (html) {
              alert('successful : ' + html);
              $("#result").html("Successful");
          },
          error: function(data, errorThrown)
          {
              alert('request failed :'+errorThrown);
          }

2

ви використовуєте функцію

error(error) 

але jquery насправді шукає функцію з трьома параметрами:

error(jqXHR, textStatus, errorThrown)

вам потрібно буде додати ще два параметри.

ТАКОЖ: будь ласка, подивіться на всі коментарі вище, де згадується "застаріле" :)

$.ajax("www.stackoverflow.com/api/whatever", {
    dataType:"JSON"
    data: { id=1, name='example' }
}).succes(function (result) {
    // use result
}).error(function (jqXHR, textStatus, errorThrown) {
    // handle error
});

4
вам потрібно буде додати ще два параметри - це так неправильно.
Розробник

1
хм. якщо це все, що ти маєш сказати - може, нічого не сказати? або, ви могли б пояснити свою заяву і фактично допомогти. Твій вибір.
increddibelly

1
У JavaScript скажіть, що у вас є метод - function myMethod (err) { alert(err); }а потім називайте його так myMethod ("something is wrong", 500, some_object)- Це буде працювати без жодних проблем. Згідно з вашим твердженням, це буде працювати лише за умови підпису методу function myMethod (err, status, some_object). Забудьте про вищенаведений приклад, підпис successподії, яку ви маєте у відповіді, насправді є .success(data, status, xhr), але якщо вам просто потрібен результат, ми зазвичай пов'язуємо його як .success (data)і обидва працює.
розробник

А яку додаткову вартість ви внесли, додавши цю відповідь? ІМО, у вашій відповіді немає жодної інформації, якої бракувало в попередніх відповідях. Єдине, що ви зробили, це знову підтягувало це питання в стеку.
Розробник

0

Від jquery.com:

The jqXHR.success(), jqXHR.error(), and jqXHR.complete()
callback methods introduced injQuery 1.5 are deprecated
as of jQuery 1.8. To prepare your code for their eventual 
removal, use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.

Якщо ви хочете отримати глобальних обробників, ви можете використовувати:

.ajaxStart(), .ajaxStop(),
.ajaxComplete(), .ajaxError(),
.ajaxSuccess(), .ajaxSend()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.