Отмена $interval.cancel на основе идентификатора, переданного в $interval.timer

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

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

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

Итак, мой вопрос: Как отменить таймер на основе идентификатора.

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.


person Nicoleta Wilskon    schedule 21.01.2019    source источник
comment
Взгляните на мой ответ, я не уверен, что он даст какую-то ошибку, но этого подхода должно быть достаточно. Если вам нужен рабочий код, вы можете создать демо-код на plunkr.com и сообщить мне   -  person Shashank Vivek    schedule 21.01.2019


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

person Shashank Vivek    schedule 21.01.2019