有没有办法为拦截器请求$ http?

时间:2014-01-14 16:45:39

标签: angularjs

这个想法是在某些情况下从另一个来源获取数据,所以我有这个存根:

factory("interceptor", function ($q, $location, $http) {
    return function (promise) {
        return promise;
    }
}

失败
  

[$ injector:cdep]发现循环依赖:拦截器< - $ http

还试图注入$ injector并使用它来检索$ http,结果相同。有什么想法吗?

.config只是声明:

.config(function ($httpProvider) {
    $httpProvider.responseInterceptors.push('interceptor');
});

2 个答案:

答案 0 :(得分:9)

$injector注入interceptor

使用它在回调函数内的返回对象内获取$http

这是example

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

app.factory("interceptor", function ($q, $location, $injector) {
  return {
    request: function(config){      
      var $http = $injector.get('$http');
      console.dir($http);
      return config;
    }
  }
});

app.run(function($http){
  $http.get('/')
});

答案 1 :(得分:1)

在查看Angular源代码后,更好的答案是这样的。 $ http方法可以在没有依赖注入的情况下访问,所以诀窍是不要INJECT $ http并简单地使用它。像这样:

Right Way

retryModule = angular.module('retry-call', [])

# Do not inject $http
retryModule.factory 'RetryCall', ($q)->
  # More object keys
  'responseError': (response)=>
    # Just use $http without injecting it
    $http(response.config)
    $q.reject(response)

retryModule.config ['$httpProvider', ($httpProvider)->
    $httpProvider.interceptors.push('RetryCall');
]

Wrong Way

# Do not do it this way.
retryModule.factory 'RetryCall', ($q,$http)->