Search code examples
javascriptangularjsautocompleteangular-resourceangular-http

Angularjs - Abort/cancel running $http calls


I've got a call using Resource in angularjs but i get some problems because i can't abort every calls it does. This kind of structure i use for an autocomplete.. is it possible convert from resource call to http? This is the code

var Resource = $resource(URL, {},{ getAutocompleteResults: { method: "GET", params: {text: ""} }});

var locked = false;
function getMoreData() {

    if(locked)
        return;
    locked = true;

    Resource.autoCompleteResults()
        .$promise.then(function(data) {
            $scope.autocompleteViewResults = data;
            locked = false;
        });

}

This is what i've tried so far with no success.

$scope.autocompleteViewResults = function () {
            $http
                .get(URL, {
                    params: {
                        text = ""
                    }
                })
                .success(function (data) {
                    $scope.autocompleteViewResults = data;
                });
        };

Or if someone knows an alternative method..


Solution

  • The $scope.autocompleteViewResults variable is being assigned 2 times.

    Try this:

    $scope.autocompleteViewResults = {};
    $scope.getResults = function(valueAsTyped) {
            $http
                .get(URL, {
                    params: {
                        text: valueAsTyped
                    }
                })
                .success(function (data) {
                    $scope.autocompleteViewResults = data;
                });
      };
    

    Update

    If you need to cancel old requests.

    var promiseCanceller = $q.defer();
    $scope.autocompleteViewResults = {};
    
    $scope.getResults = function(valueAsTyped) {
    
            promiseCanceller.resolve('request cancelled'); // cancel currently running request
            $http
                .get(URL, {
                    params: {
                        text: valueAsTyped
                    },
                    timeout: promiseCanceller.promise // pass promiseCanceller as the timeout
                })
                .success(function (data) {
                    $scope.autocompleteViewResults = data;
                });
      };