Pytanie Zawiń metodę $ .ajax () jQuery, aby zdefiniować globalną obsługę błędów


Rozgałęzienie pytań takich jak ten, Chciałbym objąć metodę $ .ajax () jQuery, aby umożliwić obsługę błędów w jednej lokalizacji, która następnie byłaby używana automatycznie przez wszystkie zdalne wywołania aplikacji.

Prostym podejściem byłoby po prostu utworzenie nowej nazwy, podobnej do tego, w jaki sposób $ .get () i $ .post () implementują fasady do $ .ajax (). Mam jednak nadzieję, że ponownie użyję nazwy $ .ajax (), dzięki czemu będziemy mogli zachować resztę kodu przy użyciu standardowej składni jQuery, ukrywając przed tym faktem, że dodaliśmy własną obsługę błędów. Czy jest to praktyczne i / lub dobre do osiągnięcia, a może nawet okropny pomysł?

EDYCJA: Odpowiedzi do tej pory wskazują, że .ajaxError () jest drogą do zrobienia. Wiem, że to złapie błędy poziomu 400 i 500, ale czy istnieje sposób (z tym programem obsługi zdarzeń lub w inny sposób) do przechwytywania 302 przekierowań? Próbuję obsłużyć odpowiedzi przekierowujące do strony logowania, ale chcemy przechwycić to przekierowanie, gdy jest to żądanie XHR, pozwalając użytkownikowi anulować działanie zamiast wymuszać je automatycznie.


21
2017-12-03 02:27


pochodzenie


Na marginesie odpowiedzi na niezalogowane żądania AJAX powinny prawdopodobnie powrócić do 401 zamiast do 302. W każdym razie jedzenie do myślenia. - gtd


Odpowiedzi:


Możesz na to patrzeć $.ajaxError.

$(document).ajaxError(function myErrorHandler(event, xhr, ajaxOptions, thrownError) {
  alert("There was an ajax error!");
});

jQuery zapewnia cały szereg innych sposobów dołączania globalnych procedur obsługi.

Aby odpowiedzieć na twoją edycję, możesz łapać udane prośby ajaxowe $.ajaxSuccessi możesz złapać wszystkie (zakończone sukcesem i nieudane) $.ajaxComplete. Możesz uzyskać kod odpowiedzi z xhr parametr, jak

$(document).ajaxComplete(function myErrorHandler(event, xhr, ajaxOptions, thrownError) {
  alert("Ajax request completed with response code " + xhr.status);
});

26
2017-12-03 02:31



@Marc L: edytowane w celu dopasowania do dodatkowych informacji. Ponadto może być to interesujące: stackoverflow.com/questions/199099/... - sje397
Próbować $(document).ajaxError(…); - za pomocą $.ajaxError(...) nie działa dla mnie. - ripper234


W rzeczywistości jQuery zapewnia hak, .ajaxError() tylko w tym celu. Wszystkie i wszystkie procedury obsługi, z którymi jesteś związany $ajaxError() zostanie wywołany, gdy żądanie ajax ze strony zakończy się błędem. Określenie selektora umożliwia odwołanie this wewnątrz twojego .ajaxError() treser.

Aby użyć go do obsługi wszystkich błędów zapytania ajax na stronie i używać this wskazywać document, możesz zrobić coś takiego:

$(document).ajaxError(function(event, request, settings){
   alert("Error requesting page: " + settings.url);
});

1
2017-12-03 02:32



Aby wyjaśnić, ajaxError obsługuje wszystkie awarie ajax, nie tylko te, które pasują do selektora. Użycie selektora pozwala tylko na użycie thissłowo kluczowe wewnątrz wywołania zwrotnego w celu odwołania się do tego elementu. - David Tang


jQuery ma poręczną metodę o nazwie $ .ajaxSetup (), która pozwala ustawić opcje, które mają zastosowanie do wszystkich żądań AJAX opartych na jQuery, które przychodzą po nim. Po umieszczeniu tej metody w funkcji gotowego dokumentu głównego wszystkie ustawienia zostaną automatycznie zastosowane do pozostałych funkcji w jednym miejscu

$(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);
            }
        }
    });
});

Odniesienie: https://cypressnorth.com/programming/global-ajax-error-handling-with-jquery/


1
2018-06-09 13:50



Myślę, że jest to lepsze niż ajaxError (), ponieważ nie ma potrzeby, aby wiązać słuchacza z DOM i ma więcej sensu, gdy mówisz globalnie. - Wancieho


Myślę, że to zły pomysł. Myślę, że zawijam $.ajax jest w porządku, ale mówisz o tym ponownie zdefiniować to. Każdy, kto nie zdaje sobie z tego sprawy, uzyska nieoczekiwane rezultaty.

Jak wspomnieli inni, wiążąc program do $.ajaxError jest drogą do zrobienia.


0
2017-12-03 02:37