Отмена $ interval.cancel на основе идентификатора, переданного в $ interval.timer - PullRequest
0 голосов
/ 21 января 2019

В приведенном ниже коде мы вызываем функцию startTimer, где мы используем $interval, чтобы инициировать запрос к бэкэнду, пока не получим data.status == "complete", а после завершения состояния мы устанавливаем flag = true иФлаг приведет к запуску часов и вызовет функцию $scope.stop для отмены таймера, используя $interval.cancel.

Но здесь возникает проблема, т. е. $interval.cancel не знает, какой таймер остановить первым.

При наличии нескольких запросов на вызов таймера на основе идентификатора завершенный таймер на основе этого идентификатора должен быть отменен.

Так что мой вопрос Как отменить таймер на основе сценария 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 Ответ

0 голосов
/ 21 января 2019

Взгляните на:

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, поэтому я думаю, что этот подход должен работать лучше.

...