Угловой отказ от поведения перехватчика

В моем угловом приложении я ищу способ обработки всех ошибок ответа сервера (с помощью всплывающего окна с сообщением об ошибке), но позволяю контроллеру отказаться от этого поведения и, если необходимо, выполнить собственную обработку ошибок при вызове $ ресурс.

Я планировал просто использовать перехватчик, чтобы он обрабатывал все ошибки. Что-то вроде

$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 с сервера будет перенаправлен на ваш соответствующий контроллер или обработчик ошибок службы.

Другие вопросы по тегам