Wrap jQuery $.ajax() для определения глобальной обработки ошибок
Включение вопросов, таких как этот > , я ищу способ переноса jQuery $.ajax(), чтобы я мог выполнять обработку ошибок в одном месте, что будет автоматически использоваться всеми удаленными вызовами приложения.
Простым подходом было бы просто создать новое имя, похожее на то, как $.get() и $.post() реализуют фасады до $.ajax(). Тем не менее, я надеюсь повторно использовать имя $.ajax(), чтобы мы могли сохранить остальную часть нашего кода, используя стандартный синтаксис jQuery, скрывая от него тот факт, что мы добавили нашу собственную обработку ошибок. Является ли это практическим и/или хорошим достижением или, возможно, ужасной идеей?
EDIT: ответы пока указывают, что путь .ajaxError() - это путь. Я знаю, что это поймает 400 и 500 ошибок уровня, но есть ли способ (с этим обработчиком событий или иначе) поймать 302 перенаправления? Я пытаюсь обрабатывать ответы, которые перенаправляются на страницу входа, но мы хотим перехватить эту переадресацию, когда это запрос XHR, позволяя пользователю отменить действие, а не форсировать их автоматически.
Ответы
Ответ 1
Возможно, вы захотите посмотреть $.ajaxError
.
$(document).ajaxError(function myErrorHandler(event, xhr, ajaxOptions, thrownError) {
alert("There was an ajax error!");
});
jQuery предоставляет целую кучу других способов подключения глобальных обработчиков.
Чтобы ответить на ваше редактирование, вы можете поймать успешные запросы ajax с помощью $.ajaxSuccess
, и вы можете поймать все (успешно и неудачно) с помощью $.ajaxComplete
. Вы можете получить код ответа из параметра xhr
, например
$(document).ajaxComplete(function myErrorHandler(event, xhr, ajaxOptions, thrownError) {
alert("Ajax request completed with response code " + xhr.status);
});
Ответ 2
На самом деле, jQuery предоставляет hook, .ajaxError()
только для этой цели. Любые и все обработчики, с которыми вы связаны с $ajaxError()
, будут вызываться, когда запрос ajax со страницы завершается с ошибкой. Указание селектора позволяет ссылаться на this
внутри вашего обработчика .ajaxError()
.
Чтобы использовать его для обработки всех ошибок запроса ajax на странице и использовать this
для указания на document
, вы можете сделать что-то вроде этого:
$(document).ajaxError(function(event, request, settings){
alert("Error requesting page: " + settings.url);
});
Ответ 3
Я думаю, что это плохая идея. Я думаю, что упаковка $.ajax
прекрасна, но вы говорите о переопределении. Любой, кто этого не осознает, получит неожиданные результаты.
Как уже упоминалось, привязка обработчика к $.ajaxError
- это путь.
Ответ 4
jQuery имеет удобный метод с именем $.ajaxSetup(), который позволяет вам устанавливать параметры, которые применяются ко всем запросам AJAX на основе jQuery, которые появляются после него. Поместив этот метод в свою основную документацию, все настройки будут применены к остальным вашим функциям автоматически и в одном месте
$(function () {
//setup ajax error handling
$.ajaxSetup({
error: function (x, status, error) {
if (x.status == 403) {
alert("Sorry, your session has expired. Please login again to continue");
window.location.href ="/Account/Login";
}
else {
alert("An error occurred: " + status + "nError: " + error);
}
}
});
});
Ссылка: https://cypressnorth.com/programming/global-ajax-error-handling-with-jquery/