2015-03-13 1 views
16

В моем приложении я использую перехватчик, чтобы поймать все ошибки ответа HTTP, как:angularJS: заказные 404 перехватчик ручки - ответ с 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); 
}; 

И когда я иду в мой контроллер (когда мой getArticles метод возвращает некоторые данных, а не 404 - когда массив статей пуст) все в порядке: поймано 404 с skipException == true.

Но когда мой массив статей пуст, сервер возвращает 404, и когда я вхожу в этот контроллер, я не могу получить response.config.url - ответ не пойман, но почему? Я думал, что перехватчик поймает все ответы.

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

и $scope.getArticles имеет такой код:

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

обслуживание:

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

Как можно условно поймать 404 в зависимости от URL? Потому что это:

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

Не всегда работает.

+2

Ошибка проверки логики по URL-адресу. Кажется, у вас должны быть разные Службы и/или методы обслуживания для разных действий с перехватчиками. Методы обслуживания должны вызывать разные перехватчики, которые вызывают разные средства устранения ошибок. Один из Error Resolvers должен обрабатывать 404, а другой должен игнорировать 404. Метод службы должен решить это. Логика связи с URL-адресами звучит как нарушение SoC. –

+0

вы можете поделиться полным кодом ошибки-ответа – harishr

+1

@DaveAlperovich не могли бы вы представить пример с различными перехватчиками в моем случае? – brabertaser19

ответ

1

так ... я сделал это так:

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

От documentation:

код состояния ответа от 200 до 299 считается состояние успеха и приведет к тому, обратный вызов вызывается.

Поскольку сервер возвращает 404, вызывается функция responseError. К сожалению, параметр конфигурации недоступен, поэтому вы не можете выполнять условную логику на основе URL-адреса запроса.

1

В "ответ" вы Шоуда проверить URL ответа, не response.config.url .. что-то вроде этого:

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

на уровне ответа у вас нет config

2

вы можете проверить Restangular, может быть полезно для ваших целей. У этого есть хорошие методы перехватчика, встроенные. Действительно ли это действительно хорошо для Вас, будет зависеть от того, используете ли вы RESTful API или нет. https://github.com/mgonto/restangular

2

В стремлении быть более легким в обслуживании и расширяемый до любого $ HTTP службы вызова можно сделать так:

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

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

} 
Смежные вопросы