取消有角度的服务承诺

时间:2016-12-13 15:57:55

标签: javascript angularjs angular-promise angular-http

我有一个执行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()承诺?

3 个答案:

答案 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

相关问题