Остановка функции от запуска

0

У меня есть 3 последовательных divs для отображения на странице, загрузка страницы показывает div 1, перейдя на второй, он запускает таймер, когда этот таймер заканчивается, он возвращается к первому div. Переход к следующему div должен снова запустить таймер. Функция таймера работает нормально на первой странице, но на второй странице, когда она называется, она уже работает из предыдущего div, и поэтому указывает на то, что время в два раза быстрее, а на последнем div - 3 раза.

Как я могу заставить его остановить текущую функцию, а затем перезапустить ее?

Благодаря,

$scope.timeLeft = 0;

   var timeoutRunner = function (timerLength) {
     $scope.timeLeft = timerLength;

     var run = function () {

       if ($scope.timeLeft >= 1) {
         console.log($scope.timeLeft);
         $scope.timeLeft--
         $timeout(run, 1000);
       } else if ($scope.timeLeft == 0){
         $scope.endTransaction();
       }
     }
     run();
   }

timeoutRunner(5);
Теги:

3 ответа

0
Лучший ответ

Каждый раз, когда я вызывал функцию, он создавал новый экземпляр, и я не мог остановить его по требованию, поэтому нашел способ сказать, какой экземпляр я хочу запустить:

$scope.timeLeft = 0;
   var instanceRunning = 0;

   var timeoutRunner = function (timerLength, instance) {
     $scope.timeLeft = timerLength;
     instanceRunning = instance;

     var run = function () {
       if (instanceRunning == instance){
         if ($scope.timeLeft < 7 && $scope.timeLeft > 0){
           $('#timer-container').show();
         } else {
           $('#timer-container').hide();
         }
         if ($scope.timeLeft >= 1) {
           console.log($scope.timeLeft);
           $scope.timeLeft--
           $timeout(run, 1000);
         } else if ($scope.timeLeft == 0){
           $scope.endTransaction();
         }
       }
     }
     run();
   }


timeoutRunner(20, 1);
timeoutRunner(20, 2);
timeoutRunner(20, 3);
0

Не знаете, где вы хотите точно отменить свой тайм-аут (просмотреть изменение? Когда вы закончите транзакцию?) Но вот как вы это сделаете:

$scope.timeLeft = 0;

var timeoutPromise = false;

var timeoutRunner = function (timerLength) {
    $scope.timeLeft = timerLength;
    var run = function () {
        if ($scope.timeLeft >= 1) {
            console.log($scope.timeLeft);
            $scope.timeLeft--
            timeoutPromise = $timeout(run, 1000);
        } else if ($scope.timeLeft == 0){
            $scope.endTransaction();
            $timeout.cancel(timeoutPromise);
        }
    }
    run();
}

timeoutRunner(5);
0

Вам нужно добавить некоторую логику, которая вызывает $timeout.cancel(timeoutRunner); ,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню