1

У меня есть следующий перехватчик:

var interceptor = ['$http', '$q', function ($http, $q) { 
    //... 
}]; 

Это создает циклическую зависимость, потому что $http будет зависеть от этого перехватчика, и этот перехватчик будет зависеть от $http.

Я хочу, чтобы получить $http службу, потому что я намерен обновить некоторые маркеры авторизации пользователя, если я получаю 401 Несанкционированное ответ.

Для этого я должен позвонить своей конечной точке OAuth и получить новые токены.

Как я могу ввести эту услугу в свой перехватчик?

Я также попробовал следующую альтернативу:

var interceptor = ['$injector', '$q', function ($injector, $q) { 
    var $http = $injector.get('$http'); 
}] 

Но я получаю ту же ошибку.

Возможно ли это?

Я не хочу использовать библиотеку jQuery, и я хочу, чтобы мое приложение было чистым AngularJS, поэтому ответы $.ajax(...) мне не пригодились.

+0

Может быть, вы можете выстрелить событие или вызвать другую службу, чтобы сделать работу для вас? – JoseM

ответ

2

Даже второй фрагмент вызывает ошибку cdep, поскольку служба перехватчика получит экземпляр, а в конструкторе вы пытаетесь получить $http в процессе, что вызывает ошибку cdep. Вам нужно будет получить http-сервис (или любую вашу службу, которая вводит http) позже, после того, как будет запущена служба перехватчика. Вы можете легко получить его от $injector по запросу, когда вам это нужно, например, на reponseError.

var interceptor = ['$injector', '$q', 
    function($injector, $q) { 
     return { 

     responseError: function(rejection) { 
      //Get it on demand or cache it to another variable once you get it. But you dont really need to do that you could get from the injector itself since it is not expensive as service is a singleton. 
      var $http = $injector.get('$http'); 
      //Do something with $http 
      return $q.reject(rejection); 
     } 
     } 
    } 
    ] 
-1

попробовать оборачивать код инжектора с в анонимной функции

var interceptor = ['$injector', '$q', function ($injector, $q) { 
      return function(){ 
       var $http = $injector.get('$http'); 
      } 
    }]; 
Смежные вопросы