jQuery ajax - избегание callback-функции error () при вызове callback-функции statusCode () - PullRequest
17 голосов
/ 27 февраля 2012

Я использую jQuery.ajax () для подключения к моей серверной службе.Я настроил обработчик ошибок () и обработчик statusCode ().Они оба работают нормально, но когда запускается мой обработчик statusCode, также запускается обработчик ошибок (сначала запускается обработчик ошибок).Я бы предпочел, чтобы этого не произошло.Я предполагаю, что это возможно без необходимости взломать код обработчика ошибок?

Мой код выглядит примерно так:

$.ajax({
    ...
    error: function(...) { 
        // process a general type of error here
    },
    statusCode: {
        401: function() {
            // process a specific authentication failure
        }
    }                 
});

Так как же избежать запуска обработчика ошибок (), когдаКод статуса HTTP 401?

Спасибо, что удосужились прочитать!

Ответы [ 5 ]

12 голосов
/ 27 февраля 2012

Вы можете легко проверить код состояния внутри сообщения об ошибке.Первым параметром должен быть XMLHttpRequest (или jqHXR depeding в вашей версии jQuery) объект.Проверьте свойство status для кода состояния дескриптора ошибки соответственно.

Например

error: function(a, b, c){
  if(a.status != 401){
    // handle other errors except authentication

  }
}
7 голосов
/ 27 февраля 2012

Без взлома jQuery.ajax вы не сможете. Для меня ajax-методы jQuery - одна из проблемных частей библиотеки. Для более разумной обработки запросов я рекомендую заглянуть в superagent или в другую автономную библиотеку.

6 голосов
/ 27 августа 2013

Улучшение предыдущих обходных путей, которые требуют жесткого кодирования кодов состояния, для которых вы не хотите запускать общий обработчик событий.

По моему мнению, безопаснее редактировать ваш обработчик ошибок, так как beforeSend может быть перезаписандля какой-то другой цели, и поэтому вы можете непреднамеренно запустить общий обработчик ошибок для этих вызовов.(Если кто-то перезаписывает обратный вызов ошибки, он ожидает, что это повлияет на обработку ошибок, если он изменяет обратный вызов beforeSend, которого он не делает).

Таким образом, вы получите:

function ajaxError (jqXHR, textStatus, errorThrown)
{
    if (jqXHR.status in this.statusCode) return;
    // Handle generic events here.

}
2 голосов
/ 05 февраля 2013

Вы можете попробовать использовать ajaxSetup и beforeSend, чтобы автоматически настроить обработчик ошибок вашего запроса ajax:

$.ajaxSetup({
  beforeSend: function(jqXHR, settings) {
    if (typeof settings.error === 'function') {
      var errorfunc = settings.error;
      settings.error = function(jqXHR2, textStatus, errorThrown) {
        if (jqXHR2.status !== 401) errorfunc(jqXHR2, textStatus, errorThrown);
      };
    }
  }
});

В моем случае это работает.

0 голосов
/ 27 февраля 2012

Ознакомьтесь с ответом в этом посте об обработке кодов состояния с помощью метода ошибки: как получить код состояния jquery ajax

...