所以我拦截一个有角度的$ http请求和响应。让我们说如果我有一个响应错误,我想重新调用我的$ http调用。问题是我需要向我的拦截器注入$ http服务,它会创建一个循环依赖。这是我在coffeescript中的代码的简化版本:
retryModule = angular.module('retry-call', [])
retryModule.factory 'RetryCall', ($q, $http)->
# More object keys
'responseError': (response)=>
# Retry request if failed
# I need a different way of invoking $http() to avoid circular dependency
$http(response.config)
$q.reject(response)
retryModule.config ['$httpProvider', ($httpProvider)->
$httpProvider.interceptors.push('RetryCall');
]
由于
答案 0 :(得分:1)
为了避免循环依赖,您可以随时装饰$http
服务来处理此功能。这是装饰者的example。
你基本上会做这样的伪代码:
var old_post = $delegate.post;
$delegate.post = function(post_stuff) {
var def = $q.defer();
old_post(post_stuff).then(function(data) {
if (data.error) {
$delegate.post(post_stuff).then(function(data) {
def.resolve(data);
}
} else {
def.resolve(data)
}
}, function(err_data) {
// Also retry here
});
};
return $delegate;
这基本上将原始$ http调用包装在您的重试功能中。代码未经测试,因为它只是如何做到这一点的基本思路。另外你应该小心,因为这可能会产生无限循环。
希望这有帮助!
答案 1 :(得分:0)
在查看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)->