2013-11-22 17 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; 
    }; 
}); 
関連する問題