我已经尝试了一些东西但是在上一个请求完成之前调用该函数时似乎无法取消http请求。我使用1.5.7并且每次执行$ scope.glsuggested我想取消任何挂起的glsuggested.get()请求,尝试了一些事情来拒绝$ q.defer但没有运气。
这是我得到的:
// Controller.
export class BudgetController {
constructor ($scope, $q, $timeout, $log, glbudget, glsuggested) {
'ngInject';
$scope.glsuggested = function(cat) {
var _getsuggested = glsuggested.get(cat);
_getsuggested.then(function(data) {
$scope.glproducts = data;
}, function(error) {
$scope.budgetdetails = 'error';
$log.log(error);
});
};
}
}
// Service
export class GlsuggestedService {
constructor ($http, $q, $rootScope, $log) {
'ngInject';
this.$http = $http;
this.$q = $q;
this.$rootScope = $rootScope;
this.$log = $log;
}
get(category) {
var defer = this.$q.defer();
var headers = {
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json'
};
var req = this.$http({
method: 'GET',
headers: headers,
url: this.$rootScope.apiurl + '/products/recommend/' + category,
timeout: defer.promise
});
var _log = this.$log.log;
req.success(function(data) {
_log('success!', data, data.id);
return defer.resolve(data);
});
req.error(function(data) {
_log('error!', data);
return defer.reject('error');
});
return defer.promise;
}
}
答案 0 :(得分:0)
由于您将timeout: defer.promise
作为$ http请求的其中一个选项,因此在defer.promise
结算之前请求不会取消。
因此,当您将defer.resolve
放入req.success
回调时,它没有意义,因为您基本上是在完成后尝试取消$ http请求。
此外,$http.get
实际上返回了一个promise,因此无需通过另一个promise返回其结果。在get()
方法中,您实际上可以返回req
并在then
回调中处理结果。
您可能还应在服务中创建另一个返回defer.promise
并在控制器中调用该方法的方法。然后,当您想要取消$ http请求时,您可以在控制器中承诺resolve
。
抱歉,我知道这有点令人困惑,但如果有意义或者您需要进一步解释,请告诉我。