2013-07-23 17 views
7

Czy istnieje sposób w mojej wykonanej obsługi jQuery XHR (utworzonej z wywołania $ .get()) w celu wyszukania problemów w odpowiedzi, a następnie wyzwalania zarejestrowanych kolejnych handlerów (kłamstwo nie zawsze jest &) z niestandardowym komunikatem o błędzie?jQuery AJAX lub wyzwalacz wywołania żądania XHR fail callback z wykonanego wywołania zwrotnego

coś takiego:

$.get(URL) 
.done(
    function (data, status, res) { 
    if(/*some condition*/){ 
      this.Reject(res, status, "some reason"); 
      return  
     } 
    //Do stuff on success 
    } 
) 

.fail(
//Common error handler here 
) 
.always(
    //common always handler here 
); 

Rodzaj filtra wtórnego Done. Powodem są oczywiście wszystkie interfejsy API, które przesuwają błąd w odpowiedzi 200, której jQuery nigdy nie mógł wiedzieć, był błędem.

+0

No nie ma! Metoda fail działa, gdy coś zawiedzie podczas wywołania ajax. Błędy na serwerze, które nadal będą przekazywać prawidłową odpowiedź, nie są uznawane za błąd. Jeśli twój kod na serverze się nie powiedzie, możesz wywołać metodę fail, przekazując nieprawidłową treść lub nagłówek 400 lub cokolwiek innego, co naprawdę wywoła metodę fail, ale nie możesz wywołać tego z poziomu wykonanej metody, a nie jest to właściwe albo. – adeneo

+1

jak to nie jest właściwe? Często zdarza się, że kontrakt futures/promise/task może wywoływać wywołania błędów. –

+0

Tak, ale jeśli utworzysz obietnicę, może ona zostać odrzucona, aby wywołać metodę fail, w wywołaniu ajax metoda fail informuje, że coś poszło nie tak z samym wywoływaniem, podczas gdy każda ważna odpowiedź z serwera jest udanym wywołaniem ajaxowym . Wszelkie błędy występujące na serverze, które nie są w stanie spełnić oczekiwań, powinny zostać przechwycone przez procedurę obsługi sukcesu. Lub przynajmniej tak to zwykle robi, ponieważ nie można wywołać metody fail z wykonanej metody, ponieważ obietnica została już rozwiązana do tego czasu. – adeneo

Odpowiedz

4

zorientowali się, jak to zrobić, i to działa dobrze:

$.get(URL) 
.then(
    function (data, status, res) { 
     if(/**some error check**/({ 
      return $.Deferred().reject(res, status, "error message"); 
     } 

     return $.Deferred().resolve(data, status, res); 
    } 
) 
.done(
    function (data, status, res) { 
     //Do stuff on success 
    } 
) 

.fail(
//Common error handler here 
) 
.always(
    //common always handler here 
); 

działa jak czar, teraz nie mam bałagan błąd danych magazynowe w moim zrobione, mogę po prostu skupić się na przetwarzanie danych lub ustawianie komunikatów o błędach.

0

Dziękuję za to pytanie i odpowiedź Chrisa.

Próbowałem tego i zadziałało, z wyjątkiem tego, że wyzwalało funkcję fail dla niejawnego nieoczekiwanego wyjątku (spowodowanego przez błąd), a nie dla mojego testu wyjątku AJAX. Co sprawiło, że pomyślałem, że może pracować dla wyraźnego wyjątku bez kłopotów z tworzeniem nowego przedmiotu obietnicy. Tak więc chciałem spróbować rzucić okiem - i zadziałało.

To wyraźne rzucanie działa w jQuery 3. Nie jestem pewien co do wcześniejszych wersji. Próbowałem robić to w done przewodnika i to nie działa: rzucanie tylko wydaje się działać w then obsługi

$.get(URL) 
.then(
    function (data, status, res) { 
     if(/**some error check**/({ 
      throw "error message"; 
     } 

     return data; //this is also important 
    } 
) 
.done(
    function (data, status, res) { 
     //Do stuff on success 
    } 
) 

.fail(
//Common error handler here 
) 
.always(
    //common always handler here 
); 
Powiązane problemy