Angularjs 角度-使用Restanglar时中止ajax请求
我有一个方法调用angular服务,并因此通过该服务发出ajax请求。我需要确保,如果多次调用此函数,中的前一个请求将被中止(如果尚未解决,则为) 此方法可以被多次调用。此方法实际上来自Angularjs 角度-使用Restanglar时中止ajax请求,angularjs,restangular,Angularjs,Restangular,我有一个方法调用angular服务,并因此通过该服务发出ajax请求。我需要确保,如果多次调用此函数,中的前一个请求将被中止(如果尚未解决,则为) 此方法可以被多次调用。此方法实际上来自ngTableParams上的ngTable: getData = function($defer, params) { myService.getRecord(params).then(function(res){ ... $defer.res
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(); }
});
}
}
谢谢,我没有提到,但我已经知道这是一个超时的承诺。我加入了我自己的代码,因为我不知道它如何真正适合我的用例来完成我要做的事情。