Угловой отказ от поведения перехватчика
В моем угловом приложении я ищу способ обработки всех ошибок ответа сервера (с помощью всплывающего окна с сообщением об ошибке), но позволяю контроллеру отказаться от этого поведения и, если необходимо, выполнить собственную обработку ошибок при вызове $ ресурс.
Я планировал просто использовать перехватчик, чтобы он обрабатывал все ошибки. Что-то вроде
$httpProvider.interceptors.push(function($q) {
return {
'responseError': function(rejection) {
displayMessage(rejection);
return $q.reject(rejection);
}
};
});
Потом с контроллера, если я позвоню
$scope.widget = WidgetResource.get();
и сервер отвечает с ошибкой 401, пользователю будет показано сообщение об ошибке, говорящее, что они не авторизованы.
Но мне пришло в голову, что иногда контроллер может хотеть обрабатывать ответы об ошибках самостоятельно (а именно, лучший способ отобразить ошибку в данном контексте). Каким образом он мог бы отказаться от того, что делает перехватчик?
С другой стороны, возможно, перехватчики не способ пойти на это. Что еще я мог бы использовать, чтобы справиться с этой сквозной проблемой и позволить отказаться?
1 ответ
Вы можете использовать перехватчики для обработки ошибок, которые не зависят от контекста. Мы нашли, что это действительно хорошая практика. Например, тайм-аут сеанса (401) или внутренняя ошибка сервера (500) - это ошибки, которые могут быть обработаны вашим перехватчиком. В то время как специфичные для контекста ошибки лучше обрабатываются в соответствующих им обратных вызовах служб.
На основе кодов состояния HTTP вы можете различить следующим образом:
function responseError(rejection) {
switch (rejection.status) {
case 401:
//handle unauthenticated request
case 500:
//Oops something has gone wrong due to an internal server error
default:
break;
}
return $q.reject(rejection);
}
на $q.reject(rejection)
элемент управления пересылается обработчику ошибок соответствующего экземпляра $resource. Таким образом, в приведенном выше примере 404 с сервера будет перенаправлен на ваш соответствующий контроллер или обработчик ошибок службы.