Angularjs 如何在$state change上使用promis取消所有挂起的$resource请求
当状态发生变化时,我正在尝试停止所有挂起的请求。下面的代码适用于$http,但不适用于$resourceAngularjs 如何在$state change上使用promis取消所有挂起的$resource请求,angularjs,angular-ui-router,ngresource,Angularjs,Angular Ui Router,Ngresource,当状态发生变化时,我正在尝试停止所有挂起的请求。下面的代码适用于$http,但不适用于$resource var cancel=$q.defer(); $http.get('api/cafservicestatus',{timeout:cancel.promise,cancel:cancel}).then(onsuccess,onerror); function onsuccess(result) { console.log(r
var cancel=$q.defer();
$http.get('api/cafservicestatus',{timeout:cancel.promise,cancel:cancel}).then(onsuccess,onerror);
function onsuccess(result) {
console.log(result)
}
function onerror(error) {
console.log(error)
}
function stopHttp() {
$http.pendingRequests.forEach(function(request) {
if (request.cancel) {
request.cancel.resolve();
}
});
}
但是这段代码不适用于$resource
下面是$resource的示例代码
$resource(resourceUrl, {}, {
'query': { method: 'GET', isArray: true,timeout:$q.defer().promise,cancel:$q.defer()},
'get': {
method: 'GET',
transformResponse: function (data) {
if (data) {
data = angular.fromJson(data);
}
return data;
}
},
'update': { method:'PUT' }
});
如何使用$resource停止所有请求我已经解决了这个问题。您必须为您的请求添加一个Cancelable:true,并使用$resource的$cancelRequest()方法在控制器中取消该请求
var cancel=$q.defer();
$http.get('api/cafservicestatus',{timeout:cancel.promise,cancel:cancel}).then(onsuccess,onerror);
function onsuccess(result) {
console.log(result)
}
function onerror(error) {
console.log(error)
}
function stopHttp() {
$http.pendingRequests.forEach(function(request) {
if (request.cancel) {
request.cancel.resolve();
}
});
}
$resource(resourceUrl, {}, {
'query': { method: 'GET', isArray: true,timeout:$q.defer().promise,cancel:$q.defer()},
'get': {
method: 'GET',
transformResponse: function (data) {
if (data) {
data = angular.fromJson(data);
}
return data;
}
},
'update': { method:'PUT' }
});
例如,在你的情况下
$resource(resourceUrl, {}, {
'query': { method: 'GET', isArray: true,cancellable:true},
'get': {
method: 'GET',
transformResponse: function (data) {
if (data) {
data = angular.fromJson(data);
}
return data;
}
},
'update': { method:'PUT' }
});
在你的控制器里
var aborted= YourService.query();
//and later on state change
$scope.$on('$stateChangeSuccess',function(event){
aborted.$cancelRequest();
}
);
这只解决了特定控制器的问题。我想要的是立即取消$rootScope上的所有请求。但无论如何,非常感谢