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