2014-02-28 5 views
2

그래서 나는 $ http 요청 및 응답을 가로 채고 있습니다. 응답 오류가 발생하면 $ http 호출을 다시 호출하려고합니다. 문제는 필자의 인터셉터에 $ http 서비스를 주입해야하고 순환 종속성을 생성한다는 것입니다.

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'); 
] 

감사

+1

확인이 답변 : http://stackoverflow.com/questions/21119016/is-there-a-way-to-request-http-for-an-interceptor/21119959#21119959 –

+0

I 내가 그걸 생각했으면 좋겠어. 이제 나는 어리 석다. 롤. –

답변

0

각도 소스 코드를 검토 한 결과 더 좋은 답변을 얻을 수 있습니다. $ http 메서드는 의존성 삽입없이 액세스 할 수 있으므로 트릭은 $ 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)-> 
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 호출을 래핑합니다. 이 코드는 테스트하는 방법에 대한 기본적인 아이디어이기 때문에 테스트되지 않았습니다. 또한 무한 루프가 발생할 수 있으므로 조심해야합니다.

희망이 도움이됩니다.