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

Cancelling $interval.cancel based on id passed in $interval.timer

在下面给出的代码中,我们正在调用 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.cancel 取消时,它会使用最新的请求并取消 629 但不会取消 627

看看:

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 所以我认为这种方法应该更好用。