2013-11-22 56 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; 
    }; 
});