根据$ interval.timer中传递的ID取消$ interval.cancel

时间:2019-01-21 07:19:36

标签: angularjs timer setinterval clearinterval

在下面给出的代码中,我们正在调用startTimer函数,在这里我们使用$interval触发后端请求,直到获得data.status == "complete";状态完成后,我们设置flag = true并标记将导致触发手表,并使用$scope.stop调用$interval.cancel函数取消计时器。

但是这里出现了问题,即$interval.cancel不知道首先停止哪个计时器。

当有多个请求调用基于id的计时器时,应取消基于该id的完整计时器。

所以我的问题是如何根据ID取消计时器

angular.module('timerApp', ['timerApp.controllers']);
angular.module('timerApp.controllers', []).controller('timerController', ['$scope', '$interval',
    function($scope, $interval) {
        var timer;
        var time = 10;
        $scope.countdown = time;
        $scope.startTimer = function(id) {
            timer = $interval(function(id) {
                $scope.countdown--;
                //res is response from my backend
                someRestService(id).then(res);
                var data = res;
                if (data.status = "complete") {
                    $scope.timerFlag = true;
                }
            }, 15000);

        };

    }
    $scope.stopTimer = function() {
        $interval.cancel(timer);
    };

    $scope.$watch() {
        if ($scope.timerFlag == true) {
            $scope.stopTimer();

        }

    }
]);

场景:

 RestapiHit/627 
 RestapiHit/628
 RestapiHit/629 

它将调用627请求并完成该过程,然后在即将使用$interval.cance l取消时,将使用最新请求并取消629,但不取消

1 个答案:

答案 0 :(得分:1)

看看:

angular.module('timerApp', ['timerApp.controllers']);
angular.module('timerApp.controllers', []).controller('timerController', ['$scope', '$interval',
    function($scope, $interval) {
        var timer= {} ;
        var time = 10;
        $scope.countdown = time;
        $scope.startTimer = function(id) {
            timer[id] = $interval(function(id) {
                $scope.countdown--;
                //res is response from my backend
                someRestService(id).then(res);
                var data = res;
                if (data.status = "complete") {
                    $scope.stopTimer(id);
                }
            }, 15000);

        };

    }
    $scope.stopTimer = function(id) {
        $interval.cancel(timer[id]);
        delete timer[id];
    };

]);

现在,您只分配了一个timer值,因为它是在控制器级别声明的。但是既然如此,您可能会多次致电$interval,所以我认为这种方法应该会更好。