Search code examples
javascriptangularjsangular-promiseangular-resourcengresource

Unable to cancel request with $resource


After trying some solutions like this: Aborting ngResource using a promise object I'm unable to cancel a request made with $resource. My last try was with this:

Controller:

angular.module('theApp')
  .controller('homeController', function ($q, foodTypeFactory) {
    var vm = this;

    vm.testButton = function () {
      vm.aborter = $q.defer();
      foodTypeFactory(vm.aborter).getTest({}, function (data) {
        console.log(data);
      });
    };
    vm.cancelButton = function () {
      vm.aborter.resolve();
    }
  });

foodTypeFactory:

angular.module('theApp')
  .factory('foodTypeFactory', function ($resource, BACKEND_API) {
    return function (aborter) {
      return $resource(BACKEND_API + '/api/foodtypes/:id', {id: '@id'}, {
        getTest: {
          timeout: aborter.promise
        }
      });
    }
  });

Once the request is made it completes even if I try to cancel it. I'm using Angular 1.6.2 with angular-resource 1.6.2.

What am I doing wrong?


Solution

  • Finally I found a solution! From angular 1.5 $resource can be cancelled with $cancelRequest(). In my case:

    Controller:

    angular.module('theApp')
      .controller('homeController', function (foodTypeFactory) {
        var vm = this;
    
        vm.testButton = function () {
          vm.onGoingRequest = foodTypeFactory.getTest({}, function (data) {
            console.log(data);
          });
        };
        vm.cancelButton = function () {
           vm.onGoingRequest.$cancelRequest();
        }
      });
    

    foodTypeFactory:

    angular.module('theApp')
      .factory('foodTypeFactory', function ($resource, BACKEND_API) {
          return $resource(BACKEND_API + '/api/foodtypes/:id', {id: '@id'}, {
            getTest: {
              cancellable: true
            }
          });
      });