我有一个执行http请求的控制器 此请求可能需要2秒到4分钟才能返回一些数据 我添加了一个按钮,如果搜索时间过长,用户应单击取消请求。
控制器:
$scope.search = function() {
myFactory.getResults()
.then(function(data) {
// some logic
}, function(error) {
// some logic
});
}
服务
var myFactory = function($http, $q) {
return {
getResults: function(data) {
var deffered = $q.dafer();
var content = $http.get('someURL', {
data: {},
responseType: json
)}
deffered.resolve(content);
returned deffered.promise;
}
}
}
按钮点击:
$scope.cancelGetResults = function() {
// some code to cancel myFactory.getResults() promise
}
如何实施按钮点击取消myFactory.getResults()
承诺?
答案 0 :(得分:1)
问题使用deferred antipattern,这通常应该避免,但它符合取消的情况:
getResults: function(data) {
var deffered = $q.defer();
$http.get('someURL', {
data: {},
responseType: json
}).then(deffered.resolve, deferred.reject);
deffered.promise.cancel = function () {
deferred.reject('CANCELLED')
};
returned deffered.promise;
}
答案 1 :(得分:1)
getResult是我们正在实施取消的服务。
getResult = function(){
var deferred = $q.defer();
$http.get(url).success(function(result){
deffered.resolve(result);
}).error(function(){
deffered.reject('Error is occured!');
});
return deferred.promise;
};
其中使用url变量代替任何Restful API网址。您可以将它与给定的代码一起使用。
getResult().then(function (result) { console.log(result); };
答案 2 :(得分:0)
您可以使用应该可用的.resolve()方法。
将控制器中的promise传递给变量。
创建例如取消在工厂中承诺作为参数的方法。然后在控制器中的cancelGetResults()函数中调用此方法。
在取消方法中,您只需在传递的承诺上调用.resolve即可。
这实际上应该这样做。
https://www.bennadel.com/blog/2731-canceling-a-promise-in-angularjs.htm