Запутался в перехватчиках $http в Angular js

Действительно не могу найти хорошую документацию о перехватчиках http в Angular js. При обработке ошибок, вызванных ng-include, я могу перехватить responseError, используя это:

    app.config(function ($httpProvider) {
    $httpProvider.interceptors.push('templateInterceptor');
});

// register the interceptor as a service
app.factory('templateInterceptor', function($q) {
  return {
    'responseError': function(rejection) {
       var isTemplate = !!rejection.config.url.match(/^content/g);
       if (isTemplate) {
         // here we add error message, but how this message appesrs in the place of ng-include
         rejection.data = '<div><template-error url="\''+ (rejection.config.url) + '\'"><strong>Error from interceptor.</strong></template-error></div>';
         return rejection;
       } else {
         return $q.reject(rejection);
       }
    }
  }
});

Этот код был взят из этого вопроса как поймать угловую ошибку ng-include . Я не понимаю, как работают перехватчики? Что они должны вернуть? Как использовать параметр rejection, переданный перехватчику responseError? В rejection свойство data используется для включения сообщения об ошибке вместо невыполненной директивы ng-include, как это работает?


person Oleksandr Papchenko    schedule 26.10.2014    source источник
comment
Вы просматривали https://docs.angularjs.org/api/ng/service/$http#interceptors   -  person Reto Aebersold    schedule 26.10.2014


Ответы (1)


Если у вас есть вызов $http, например

$http(....).then(function(results) {
  // Success callback
}, function(error) {
  // Error callback
});

И сервер отвечает ошибкой, тогда перехватчики responseError будут вызываться перед запуском обратных вызовов успеха или ошибки.

  • Если окончательный перехватчик возвращает какое-либо значение, не являющееся обещанием, то с точки зрения вызывающего кода вызов $http был успешным, и будет выполнен обратный вызов успеха, передав возвращенное значение в качестве аргумента results

  • Если окончательный перехватчик возвращает промис, который разрешается со значением, то аналогично случаю выше, с точки зрения вызывающего кода, вызов $http был успешным, и будет выполнен обратный вызов успеха, передав разрешенный значение в качестве аргумента results.

  • Если конечный перехватчик возвращает обещание, которое отклонено с ошибкой, то с точки зрения вызывающего кода вызов $http был не успешным, и будет выполнен обратный вызов ошибки, передав отклоненная ошибка в качестве аргумента error.

Директива ngInclude внедрит на страницу ключ data из результатов успешного вызова $http. Код в https://stackoverflow.com/a/20838764/1319998 преобразует то, что было бы ошибочным вызовом $http из ngInclude, в успех, с html сообщения об ошибке в качестве ключа data в результате.

person Michal Charemza    schedule 26.10.2014