2013-11-22 18 views
5

Sembra abbastanza chiaro come impostare un metodo globale per interrompere le richieste HTTP. Qualcosa sulla falsariga di

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

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

Tuttavia, voglio essere in grado di annullare le richieste solo specifici. Potrei definire una risorsa separata per le richieste che devo essere in grado di abortire, ma è piuttosto brutto. C'è un modo per passare un parametro o qualcosa quando chiamo la risorsa $ che potrebbe consentire il timeout di essere condizionale? Forse sulla falsariga di:

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

Ma come accedere a FOO?

Grazie per qualsiasi intuizione!

+0

non riuscivo a trovare un modo di fare questo con il brodo angolare, così ho applicato la patch da questa richiesta di pull: https://github.com/angular/angular.js/pull/5613 - Sembra che funzioni bene. Ora, utilizzando l'esempio di codice precedente, posso semplicemente chiamare l'API . $ Abort(); per annullare la richiesta. –

risposta

0

Forse puoi provare a racchiudere la tua risorsa $ come modello e accedere ai dati tramite chiamate di servizio come questa. L'esempio mostra che solo $ routeChangeStart risolve la promessa del timeout. Quindi è in qualche modo condizionale, come hai detto.

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; 
    }; 
});