Angular-прервать ajax-запрос при использовании Restangular

у меня есть метод, который вызывает угловой сервис и, следовательно, делает запрос ajax через сервис. Мне нужно убедиться, что если это вызывается несколько раз, предыдущий запрос в aborted (если он еще не был разрешен).

этот метод может вызываться несколько раз. Этот метод на самом деле из ngTable на ngTableParams:

getData = function($defer, params) {

      myService.getRecord(params).then(function(res){ 
             ...
             $defer.resolve(res.Records);
      }); 
}

вот метод на сервисе:

this.getRecords = function(params) {
    ...

    return Restangular
          .all('/api/records')
          .post(filters);
};

Если ngTable делает 3 вызова, я хочу, чтобы первые 2 были прервано (если, конечно, они не вернулись так быстро, что это было решено)

2 ответов


вы можете отменить $http звонки через timeout config свойство, которое может быть обещанием, которое прерывает запрос при разрешении.

таким образом, в restangular, вы можете сделать это как

var abort = $q.defer();
Restangular.one('foos', 12345).withHttpConfig({timeout: abort.promise}).get();
abort.resolve();

чтобы интегрировать его с вашей usecase, например, вы могли бы иметь это в своем сервисе:

var abortGet;

this.getRecords = function(params) {
  ...
  if (abortGet) abortGet.resolve();
  abortGet = $q.defer();
  return Restangular
    .all('/api/records')
    .withHttpConfig({timeout: abortGet.promise})
    .post(filters);
}

этот способ вызова getRecords всегда прерывает предыдущий вызов, если он еще не разрешен!

надеюсь, что это помогает!


это другой подход, если вы хотите прервать все http-запросы при изменении состояния для UI-router:

angular
    .run(function(HttpHandlerSrv) {
        HttpHandlerSrv.abortAllRequestsOn('$stateChangeSuccess');
        HttpHandlerSrv.R.setFullRequestInterceptor(function(element, operation, route, url, headers, params, httpConfig) {
            httpConfig = httpConfig || {};
            if(httpConfig.timeout === undefined) {
                httpConfig.timeout = HttpHandlerSrv.newTimeout();
            }
            return { element: element, params: params, headers: headers, httpConfig: httpConfig };
        });
    })

    .factory('HttpHandlerSrv', HttpHandlerSrv);


    /** ngInject */
    function HttpHandlerSrv($q, $rootScope, Restangular) {
        var requests = [];

        return {
            R: Restangular,
            newTimeout: newTimeout,
            abortAllRequests: abortAllRequests,
            abortAllRequestsOn: abortAllRequestsOn
        };

        function newTimeout() {
            var request = $q.defer();
            requests.push(request);
            return request.promise;
        }

        function abortAllRequests() {
            angular.forEach(requests, function(request) {
                request.resolve();
            });
            requests = [];
        }

        function abortAllRequestsOn(event) {
            $rootScope.$on(event, function(event, newUrl, oldUrl) {
                if(newUrl !== oldUrl) { abortAllRequests(); }
            });
        }
    }