2015-03-13 9 views
16

Nella mia app Io uso un intercettore per catturare tutti gli errori di risposta http, come:angularJS: misura 404 maniglia intercettore - risposta con l'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); 
}; 

E quando vado al mio controller (quando il mio metodo getArticles restituisce un po ' dati, non 404 - quando l'array articoli è vuoto) tutto è OK: 404 con skipException == true viene catturato.

Ma quando il mio array di articoli è vuoto il server restituisce un 404 e quando accedo a questo controller non riesco a ottenere response.config.url - nessuna risposta viene rilevata, ma perché? Pensavo che l'intercettore avrebbe catturato tutte le risposte.

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

e $scope.getArticles ha tale codice:

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

servizio:

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; 
}; 

Come posso condizionalmente catturare 404 della seconda l'URL? Perché questo:

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

Non sempre funziona.

+2

Il controllo della logica in base all'URL sembra sbagliato. Sembra che dovresti avere diversi Servizi e/o metodi di servizio per diversi comportamenti di intercettatore. I Metodi di Servizio dovrebbero chiamare diversi interceptor che chiamano diversi Resolver di Errore. Uno degli Error Resolver dovrebbe gestire 404 e un altro dovrebbe ignorare 404. Il metodo di servizio dovrebbe decidere questo. La logica di accoppiamento con i suoni dell'URL è una violazione del SoC. –

+0

puoi condividere il codice completo di error-response – harishr

+1

@DaveAlperovich potresti fornire un esempio con diversi interceptor nel mio caso? – brabertaser19

risposta

1

così ... ho fatto così:

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

Dal documentation:

Un codice di stato di risposta tra 200 e 299 è considerato uno stato di successo e comporterà il callback successo chiamato.

Poiché il server restituisce un 404, viene chiamata la funzione responseError. Sfortunatamente, il parametro config non è disponibile, quindi non è possibile eseguire alcuna logica condizionale in base all'URL della richiesta.

1

Nella "risposta" si shoud controllare URL di risposta, non response.config.url .. qualcosa di simile:

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

a livello di risposta che non hanno il config

2

puoi controllare Restangular, potrebbe essere utile per i tuoi scopi. Ha dei buoni metodi di intercettazione integrati. Se è veramente buono per te dipende se stai usando un'API RESTful o no. https://github.com/mgonto/restangular

2

In uno sforzo per essere più gestibile e estensibile a qualsiasi $ servizio http chiamata si potrebbe fare questo:

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

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

} 
Problemi correlati