2015-03-13 8 views
16

w moim app używam przechwytywania złapać wszystkie błędy odpowiedzi HTTP, takich jak:angularjs custom 404 przechwytujących uchwyt - odpowiedź z url

var response = function(response) { 
    if(response.config.url.indexOf('?page=') > -1) { 
    skipException = true; 
    } 
    return response; 
} 

var responseError = function(rejection) { 
    if (rejection.status === 401 || rejection.status === 403) { 
    /**/ 
    } 
    else if (rejection.status >= 500 || rejection.status === 0) { 
    /**/ 
    } 
    else if (rejection.status === 404 && !skipException) { 
    /**/ 
    } 
    else if (rejection.status === 404 && skipException) { 
    /**/ 
    } 
    else{ 
    /**/ 
    } 
    return $q.reject(rejection); 
}; 

A kiedy idę do mojego kontrolera (gdy moja metoda getArticles zwraca niektóre dane, a nie 404 - kiedy tablica artykułów jest pusta) wszystko jest OK: 404 z przechwyceniem skipException == true.

Ale kiedy moja tablica artykułów jest pusta, serwer zwraca 404, a kiedy wchodzę do kontrolera, nie mogę uzyskać response.config.url - żadna odpowiedź nie zostanie złapana, ale dlaczego? Myślałem, że przechwytujący złapie wszystkie odpowiedzi.

$timeout(function() { 
     $scope.getArticles(); 
    }, 100); 

i $scope.getArticles ma taki kod:

getDataService.getArticles($scope.pageNum).then(function(response) { 
/**/ 
}); 

usługa:

var getEventsByScrollService = function(num) { 
    var deferred = $q.defer(); 
    $http.get(***, { 

    }) 
    .success(function(response) { 
     deferred.resolve(response); 
    }).error(function(err, status) { 
     if (status === 404){ 
     deferred.resolve([]); 
     } 
     else{ 
     deferred.reject(err); 
     } 
    }); 
    return deferred.promise; 
}; 

Jak mogę złapać 404 warunkowo użytkownika w zależności od adresu URL? Ponieważ:

if(response.config.url.indexOf('?page=') > -1) { 

Nie zawsze działa.

+2

Sprawdzanie logiki według adresu URL brzmi źle. Wydaje się, że powinieneś mieć różne Usługi i/lub metody Usług dla różnych zachowań przechwytujących, Metody Usług powinny wywoływać różne przechwytywacze, które wywołują różne Rozwiązania Błędów. Jeden z modułów do rozwiązywania błędów powinien obsługiwać 404, a inny powinien ignorować 404. Metoda serwisowa powinna decydować o tym. Logika sprzężenia z dźwiękami URL-a przypomina naruszenie SoC. –

+0

Czy możesz udostępnić pełny kod odpowiedzi na błąd – harishr

+1

@DaveAlperovich czy możesz podać przykład z różnymi przechwytującymi w moim przypadku? – brabertaser19

Odpowiedz

1

... więc zrobiłem to tak:

if(rejection.config.url.indexOf('?page=') > -1) { 
     skipException = true; 
    } 
-1

Z documentation:

Odpowiedź Kod stanu pomiędzy 200 a 299 jest uważany za stan sukces i spowoduje wywołanie zwrotne sukces miano.

Ponieważ serwer zwraca wartość 404, wywoływana jest funkcja responseError. Niestety parametr config nie jest dostępny, więc nie można wykonać żadnej logiki warunkowej na podstawie adresu URL żądania.

1

W "odpowiedzi" ty powinien sprawdzić url odpowiedzi, nie response.config.url .. coś takiego:

var response = function(response) { 
    if(response.url.indexOf('?page=') > -1) { 
     skipException = true; 
    } 
    return response; 
} 

na poziomie reakcji nie mają config

2

możesz sprawdzić Restangular, może być przydatny do twoich celów. Ma wbudowane dobre metody przechwytywania. Niezależnie od tego, czy naprawdę dobrze dla Ciebie będzie polegać, czy używasz API REST, czy nie. https://github.com/mgonto/restangular

2

Chcąc być bardziej linkujących i rozszerzalna do dowolnego $ wezwanie serwisu http można to zrobić:

// Service call 
$http.get({url:'/?page=', ignoreErrors: true}) 

// Interceptor 
if(rejection.status === 404 && !rejection.config.ignoreErrors) { 

} 
Powiązane problemy