Ответ 1
Без взлома jQuery.ajax
вы не сможете. Для меня методы jQuery ajax - одна из проблемных точек библиотеки. Для более разумной обработки запросов я рекомендую вам изучить superagent или какую-либо другую автономную библиотеку.
Я использую 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?
Спасибо, что потрудились читать!
Без взлома jQuery.ajax
вы не сможете. Для меня методы jQuery ajax - одна из проблемных точек библиотеки. Для более разумной обработки запросов я рекомендую вам изучить superagent или какую-либо другую автономную библиотеку.
Вы можете легко проверить код состояния внутри обратного вызова ошибки. Первым параметром должен быть XMLHttpRequest
(или jqHXR
в зависимости от вашей версии jQuery). Проверьте свойство "status" для кода состояния дескриптора ошибки соответственно.
например.
error: function(a, b, c){
if(a.status != 401){
// handle other errors except authentication
}
}
Улучшение предыдущих обходных решений, требующих жесткого кодирования кодов состояния, для которых вы не хотите запускать общий обработчик событий.
По-моему, безопаснее редактировать обработчик ошибок, поскольку до того, как SendSend может быть перезаписан для какой-либо другой цели, вы можете непреднамеренно запустить общий обработчик ошибок для этих вызовов. (Если кто-то перезаписывает обратный вызов ошибки, они ожидают, что он повлияет на обработку ошибок, если они изменяют обратный вызов beforeSend, они этого не делают.)
Итак, вы получите:
function ajaxError (jqXHR, textStatus, errorThrown)
{
if (jqXHR.status in this.statusCode) return;
// Handle generic events here.
}
Вы можете попробовать использовать 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);
};
}
}
});
В моем случае это работает.
Обратите внимание на ответ в этом сообщении об обработке кодов состояния с помощью метода ошибки: как получить код состояния jquery ajax