How to cancel an ongoing REST-call using Angular's $resource?

Problem

I've been looking over and over for an example on how to cancel an ongoing REST-call using Angular's $resource. I haven't found any solution yet, but from the Angular documentation I got the impression that it should be possible.

From the documentation:

Usage: $resource(url[, paramDefaults][, actions]);

One of the actions defined in the documentation:

timeout – {number|Promise} – timeout in milliseconds, or promise that should abort the request when resolved.

Does anyone have a working example showing how to use this timeout action with promise to cancel an ongoing request? Is it possible?

Problem courtesy of: jstensen

Solution

Yes this is possible. You have to create a defere and set the promise as parameter:

var timeoutPromise = $q.defer();

{timeout: timeoutPromise.promise}

Then you can resolve the promise at any time:

timeoutPromise.resolve(); 

It should also be possible to call $timeout.cancel(timeoutPromise). What should be equal to timeoutPromise.reject().

$timeout $q

Solution courtesy of: michael

Discussion

My code example:

var canceler = {};
$scope.doSomething = function() {
  canceler = $q.defer();
  $http.post('url', data, {timeout: canceler.promise}).
    success(function(data) {
    }).
    error(function() {
    });
};

function cancelPost() {
  canceler.resolve(); //aborts request  
}

}

Discussion courtesy of: jstensen

This recipe can be found in it's original form on Stack Over Flow.