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/