Como cancelar solicitações de recursos $

Estou tentando descobrir como usar a propriedade timeout de um recurso $ para cancelar dinamicamente solicitações pendentes. Idealmente, gostaria de poder cancelar solicitações com certos atributos (com base nos parâmetros enviados), mas parece que isso pode não ser possível. Enquanto isso, estou apenas tentando cancelar todas as solicitações pendentes e redefinindo a promessa de tempo limite para permitir novas solicitações.

O problema parece ser que a configuração do recurso $ permite apenas uma promessa estática para o valor do tempo limite. Faz sentido como eu poderia fazer isso se estivesse fazendo chamadas individuais de $ http, já que eu poderia apenas passar novas promessas para o tempo limite, mas como isso pode funcionar para um recurso de $? Eu configurei um exemplo de plunker aqui:http://plnkr.co/edit/PP2tqDYXh1NAOU3yqCwP?p=preview

Aqui está o código do meu controlador:

app.controller('MainCtrl', function($scope, $timeout, $q, $resource) {
  $scope.canceller = $q.defer();
  $scope.pending = 0;
  $scope.actions = [];
  var API = $resource(
    'index.html', {}, {
      get: {
        method: 'GET',
        timeout: $scope.canceller.promise
      }
    }
  )

  $scope.fetchData = function() {
    if ($scope.pending) {
      $scope.abortPending();
    }
    $scope.pending = 1;
    $scope.actions.push('request');
    API.get({}, function() {
      $scope.actions.push('completed');
      $scope.pending = 0;
    }, function() {
      $scope.actions.push('aborted');
    });
  }

  $scope.abortPending = function() {
    $scope.canceller.resolve();
    $scope.canceller = $q.defer();
  }
});

No momento, o cancelador funciona quando há uma solicitação pendente, mas não consigo redefini-la - uma vez que uma solicitação é cancelada, todas as solicitações futuras também serão canceladas.

Tenho certeza de que estou perdendo alguma coisa, pois poder cancelar solicitações pendentes parece um recurso crucial da maioria dos aplicativos da web (pelo menos que eu criei).

obrigado

questionAnswers(6)

yourAnswerToTheQuestion