Оберните метод $ .ajax () в jQuery, чтобы определить глобальную обработку ошибок - PullRequest
21 голосов
/ 03 декабря 2010

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

Простой подход состоит в том, чтобы просто создать новое имя, аналогично тому, как $ .get () и $ .post () реализуют фасады для $ .ajax (). Однако я надеюсь снова использовать имя $ .ajax (), чтобы мы могли сохранить оставшуюся часть кода, используя стандартный синтаксис jQuery, скрывая от него тот факт, что мы добавили собственную обработку ошибок. Это практично и / или хорошо для достижения, или, возможно, ужасная идея?

РЕДАКТИРОВАТЬ: ответы пока указывают .ajaxError () это путь. Я знаю, что это отловит ошибки уровня 400 и 500, но есть ли способ (с этим обработчиком событий или иным образом) также перехватить 302 перенаправления? Я пытаюсь обработать ответы, которые перенаправляют на страницу входа, но мы хотим перехватить это перенаправление, когда это запрос XHR, позволяя пользователю отменить действие вместо того, чтобы форсировать их автоматически.

Ответы [ 4 ]

27 голосов
/ 03 декабря 2010

Возможно, вы захотите взглянуть на $.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);
});
1 голос
/ 09 июня 2017

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/

1 голос
/ 03 декабря 2010

На самом деле, jQuery предоставляет хук, .ajaxError() только для этой цели. Все обработчики, которые вы связали с $ajaxError(), будут вызваны, когда ajax-запрос со страницы завершится с ошибкой. Указание селектора позволяет вам ссылаться на this внутри вашего обработчика .ajaxError().

Чтобы использовать его для обработки всех ошибок ajax-запросов на странице и использовать this, чтобы указать document, вы можете сделать что-то вроде этого:

$(document).ajaxError(function(event, request, settings){
   alert("Error requesting page: " + settings.url);
});
0 голосов
/ 03 декабря 2010

Я думаю, что это плохая идея. Я думаю, что упаковка $.ajax - это хорошо, но вы говорите о переопределении этого. Любой, кто не осознает этого, получит неожиданные результаты.

Как уже упоминалось, связывание обработчика с $.ajaxError - это путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...