2015-05-24 21 views
6

Podsumowując, miałem potrzebę utworzenia obiektu APP javascript, który będzie ustawiał kolejkę asynchronicznych żądań dla serwera, przetwarzał odpowiedź na JSON i rejestrował z niej błędy.Złap błąd 404 dla XHR

Błędy przetwarzania JSON były bardzo łatwe dzięki "try-catch", ale błędy serwera, takie jak 404, 500 itd., Są nadal wyświetlane w konsoli przeglądarki, podczas gdy muszę cichutko zalogować go w "APP.history".

Próbowałem zaimplementować go za pomocą poniższego kodu, ale żaden z 404 błędów nie uruchamia onerror. Co ja robię źle?

xhr = new XMLHttpRequest(); 
xhr.open("GET", url, true) 
xhr.onerror = function(){console.log("error")} 
xhr.upload.onerror = function(){console.log("error")} 

Nawiasem mówiąc, jak to zrobić z jQuery AJAX?

+0

Możesz sprawdzić wartość 'xhr.status'. Zobacz http://stackoverflow.com/questions/10931270/capture-404-status-with-jquery-ajax – JanSc

+0

zajrzyj tutaj> http://stackoverflow.com/questions/1442425/detect-xhr-error-is- naprawdę-ze względu na przeglądarkę-stop-lub-kliknij-do-nowej-strony, mam nadzieję, że to odpowiada na twoje pytanie – DKanavikar

Odpowiedz

-2

404 status nie wywoła xhr.onerror()

Rozwiązaniem jest skorzystanie z obsługi loadend(), to bez względu na pożary, można sprawdzić status.

xhr = new XMLHttpRequest(); 
xhr.open("GET", url, true); 

xhr.onloadend = function() { 
    if(xhr.status == 404) 
     throw new Error(url + ' replied 404'); 
} 
+2

punkt nie jest wskazywanie statusu błędu, to nie jest problem. Problem polega na zablokowaniu 404 i zarządzaniu konsolą, aby nie pokazywać jej użytkownikowi. Ta aplikacja JavaScrip to tylko niewielka część strony, więc WINDOW.ONERROR jest zbyt masywnym rozwiązaniem))) – Tesmen

+2

, ale ta konsola przeglądarki wyświetli "GET site.com/page.htm 404 (Not Found)", tak czy owak, mam rację ? – Tesmen

+0

Technicznie 404 to KOD, który sam w sobie nie jest błędem ... musisz użyć onloadend, aby przejrzeć kod i poprawnie przeanalizować status 404 jako błąd – Erick

21

Niedawno musiałem rozwiązać ten problem osobiście. Status 404 nie wyzwoli xhr.onerror(), ponieważ technicznie nie jest to błąd, ponieważ odpowiedź została zakończona (sama 404 jest odpowiedzią).

Moje rozwiązanie było użyć loadend() obsługi, która odpala bez względu na to, a następnie sprawdzić stan do 404, lub inny stan jesteś zainteresowany.

xhr = new XMLHttpRequest(); 
xhr.open("GET", url, true); 

xhr.onloadend = function() { 
    if(xhr.status == 404) 
     throw new Error(url + ' replied 404'); 
} 

Ta sama metoda istnieje XMLHttpRequestUpload . Niestety, nasi dostawcy przeglądarek nie pozwalają nam programowo tłumić błędów sieci w 2017. However, networks errors can be suppressed using the console's filtering options.