2013-11-22 1 views
5

HTTP 요청을 중단하는 전역 메서드를 설정하는 방법은 매우 명확합니다.

$scope.canceller = $q.defer(); 
var API = $resource('http:/foo.com', {}, {get: { 
    method:'GET', 
    timeout:$scope.canceller.promise 
}}); 

$scope.abortRequests = function() { 
    $scope.canceller.resolve(); 
} 

그러나 내가 원하는 특정 요청 만 중단하고 싶습니다. 중단 할 수 있어야하는 요청에 대해 별도의 리소스를 정의 할 수는 있지만 꽤 못 생깁니다. 조건부로 타임 아웃을 허용 할 수있는 $ 리소스를 호출 할 때 매개 변수 나 뭔가를 전달할 수있는 방법이 있습니까? 어쩌면 줄을 따라 :

var API = $resource('http:/foo.com', {}, {get: { 
    method:'GET', 
    timeout:function() { if (FOO) { return $scope.canceller.promise; }} 
}}); 

그러나 어떻게 FOO에 액세스합니까?

어떤 통찰력에도 감사드립니다!

+0

이렇게하는 방법은 찾을 수 없으므로이 풀 요청에서 패치를 적용했습니다. https://github.com/angular/angular.js/pull/5613 - 그것은 잘 작동하는 것 같다. 위의 코드 예제를 사용하면 API를 호출 할 수 있습니다. $ abort(); 요청을 중단합니다. –

답변

0

아마도 $ 리소스를 모델로 감싸고이 같은 서비스 호출을 통해 데이터에 액세스하려고 할 수 있습니다. 이 예제는 $ routeChangeStart만이 타임 아웃 약속을 해결한다는 것을 보여줍니다. 당신이 언급 한 것처럼 그것은 조건부입니다.

app.factory('fooModel', function ($resource) { 
    return function (canceler) { 
     return $resource('http:/foo.com', {}, 
      { 
       query: {method:'GET', timeout: canceler.promise }, 
      } 
     ); 
    }; 
}); 

app.service('fooService', function (fooModel, $q, $rootScope) { 
    this.getBar = function(whatEver) { 
     var deferred = $q.defer(); 
     var params = {}; 
     var canceler = $q.defer(); 

     $rootScope.$on('$routeChangeStart', function() { 
      canceler.resolve(); 
     }); 

     fooModel(canceler).query(
      params, 
      function(response) { 
       deferred.reject(response); 
      }, function(error) { 
       deferred.reject(error); 
      }); 
     return deferred.promise; 
    }; 
});