У меня есть 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);
Каждый раз, когда я вызывал функцию, он создавал новый экземпляр, и я не мог остановить его по требованию, поэтому нашел способ сказать, какой экземпляр я хочу запустить:
$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);
Не знаете, где вы хотите точно отменить свой тайм-аут (просмотреть изменение? Когда вы закончите транзакцию?) Но вот как вы это сделаете:
$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);
Вам нужно добавить некоторую логику, которая вызывает $timeout.cancel(timeoutRunner);
,