JQuery ajax - избежать обратного вызова ошибки() при вызове call-кода statusCode()

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

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

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

Итак, как я могу избежать срабатывания обработчика error(), когда код состояния HTTP равен 401?

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

Ответы

Ответ 1

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

Ответ 2

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

например.

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

  }
}

Ответ 3

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

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

Итак, вы получите:

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

}

Ответ 4

Вы можете попробовать использовать 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);
      };
    }
  }
});

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