Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 角度-使用Restanglar时中止ajax请求_Angularjs_Restangular - Fatal编程技术网

Angularjs 角度-使用Restanglar时中止ajax请求

Angularjs 角度-使用Restanglar时中止ajax请求,angularjs,restangular,Angularjs,Restangular,我有一个方法调用angular服务,并因此通过该服务发出ajax请求。我需要确保,如果多次调用此函数,中的前一个请求将被中止(如果尚未解决,则为) 此方法可以被多次调用。此方法实际上来自ngTableParams上的ngTable: getData = function($defer, params) { myService.getRecord(params).then(function(res){ ... $defer.res

我有一个方法调用angular服务,并因此通过该服务发出ajax请求。我需要确保,如果多次调用此函数,中的前一个请求将被中止(如果尚未解决,则为)

此方法可以被多次调用。此方法实际上来自
ngTableParams
上的ngTable:

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次调用被中止(当然,除非它们返回的速度太快以致于问题得到解决)

您可以通过
timeout
config属性中止
$http
调用,该属性可以是一个承诺,在问题得到解决时中止请求

所以在Restanglar中,你可以这样做

var abort = $q.defer();
Restangular.one('foos', 12345).withHttpConfig({timeout: abort.promise}).get();
abort.resolve();
例如,要将其与您的用例集成,您可以在服务中使用:

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
总是会在尚未解决之前的调用时中止


希望这有帮助

如果要在更改UI路由器的状态时中止所有http请求,这是另一种方法:

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(); }
            });
        }
    }

谢谢,我没有提到,但我已经知道这是一个超时的承诺。我加入了我自己的代码,因为我不知道它如何真正适合我的用例来完成我要做的事情。