在递归承诺链中取消或停止$ timeout

时间:2015-02-13 04:17:46

标签: javascript angularjs recursion

我有一项服务,每3秒检查一次项目状态。如果项目状态已准备就绪,则返回状态字符串。否则,请使用$timeout等待3秒钟,然后重试。

我的问题是我想在用户触发某些事件时取消或停止递归超时(例如:离开当前页面),但我不知道该怎么做。

服务:

angular.module('app')
    .factory('ItemService', ItemService);

function ItemService($timeout, DataService) {
    var service = {
        checkStatus: checkStatus
    };

    function checkStatus() {
        return DataService.getItemStatus()
            .then(function(status){
                if (status === 'ready') {
                    return status;
                } else {
                    // the item is not ready. Check again after 3 seconds
                    return $timeout(function() {
                        return checkStatus();
                    }, 3000)
                }
            });
    }

}

客户端:

angular.module('app')
    .controller('ItemCtrl', ItemCtrl);

function ItemCtrl($scope, ItemService) {
    ItemService.checkStatus()
        .then(function(status) {
            // do somethin when item is ready.
        });

    $scope.$on('destroy', function(){
        // Should stop the $timeout recursive, but don't know how..
    });
}

1 个答案:

答案 0 :(得分:0)

您应该可以使用

取消角度超时
$timeout.cancel(promise)

所以这样的事情应该有效:

var promise = ItemService.checkStatus();
promise.then(function(status) {
        // do somethin when item is ready.
    });

$scope.$on('destroy', function(){
    if(typeof promise.then === 'function') {
        $timeout.cancel(promise);
    }
});