代码之家  ›  专栏  ›  技术社区  ›  Nicoleta Wilskon

基于$interval.timer中传递的ID取消$interval.cancel

  •  1
  • Nicoleta Wilskon  · 技术社区  · 5 年前

    在下面给出的代码中,我们正在呼叫 startTimer 功能,我们使用的地方 $interval 触发对后端的请求,直到 data.status == "complete" ;一旦状态完成,我们设置 flag = true 旗子会触发手表,它会调用 $scope.stop 用于取消计时器的函数 $interval.cancel .

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

    当有多个请求根据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而不是627

    1 回复  |  直到 5 年前
        1
  •  1
  •   Shashank Vivek    5 年前

    看一看:

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