Могу ли я посмотреть, работает ли таймер? - PullRequest
61 голосов
/ 14 июля 2010

Простой вопрос, на который я не могу найти ответ: Как только setTimeout установлен, есть ли способ узнать, установлен ли он, ну, ну?что я могу сказать, когда вы clearTimeout, переменная остается на своем последнем значении.A console.log Я только что посмотрел на шоу Timer как «12», независимо от того, был ли тайм-аут установлен или сброшен.Нужно ли также обнулять переменную или использовать какую-то другую переменную в качестве логического выражения, да, я установил этот таймер?Конечно, есть способ просто проверить, работает ли тайм-аут ... верно?Мне не нужно знать, сколько еще осталось, просто если он еще работает.

Ответы [ 6 ]

50 голосов
/ 21 декабря 2011

Что я делаю, это:

var timer = null;

if (timer != null) {
  window.clearTimeout(timer); 
  timer = null;
}
else {
  timer = window.setTimeout(yourFunction, 0);
}
47 голосов
/ 14 июля 2010

Нет никакого способа взаимодействовать с таймером, кроме как для его запуска или остановки. Я обычно обнуляю переменную таймера в обработчике тайм-аута, а не использую флаг, чтобы указать, что таймер не работает. На W3Schools есть хорошее описание того, как работает таймер. В их примере они используют переменную flag.

Значение, которое вы видите, представляет собой маркер для текущего таймера, который используется, когда вы сбрасываете (останавливаете) его.

4 голосов
/ 10 августа 2017

Нет необходимости проверять существующий таймер, просто очистите его до запуска таймера.

var timer;
var startTimer = function() {
  clearTimout(timer);
  timer = setTimeout(DoThis, 6000);
}

это очистит любой таймер перед запуском нового экземпляра.

4 голосов
/ 18 февраля 2014

Установите другую переменную Timer_Started = true с вашим таймером.А также измените переменную на false при вызове функции таймера:

// set 'Timer_Started' when you setTimeout
var Timer_Started = true;
var Timer = setTimeout(DoThis,60000);

function DoThis(){

   // function DoThis actions 
   //note that timer is done.
   Timer_Started = false;

}

function Check_If_My_Timer_Is_Done(){

   if(Timer_Started){
      alert("The timer must still be running.");
   }else{
      alert("The timer is DONE.");
   }

}
1 голос
/ 25 августа 2016

Я обычно обнуляю таймер:

var alarm = setTimeout(wakeUpOneHourLater, 3600000);
function wakeUpOneHourLater() {
    alarm = null;    //stop alarm after sleeping for exactly one hour
}
//...
if (!alarm) {
    console.log('Oops, waked up too early...Zzz...');
}
else {
    console.log('Slept for at least one hour!');
}
1 голос
/ 08 мая 2016

Я знаю, что это некропост, но я думаю, что все еще люди ищут это.

Это то, что я использую: 3 переменные:

  1. t за миллисекунды с .. в Date Object для следующей цели
  2. timerSys для фактического интервала
  3. seconds установлен порог для миллисекунд

затем у меня есть function timer с 1 переменной, функция проверяет, является ли переменная истинно , если так, он проверяет, работает ли таймер, и если это так, чем заполняет глобальные переменные , если нет верно , ложно , очищает интервал и устанавливает global var timerSys в ложь ;

var t, timerSys, seconds;

function timer(s) {
  if (s && typeof s === "number") {
    if (typeof timerSys === "boolean" || typeof timerSys === "undefined") {
      timerSys = setInterval(function() {
        sys();
      }, s);
      t = new Date().setMilliseconds(s);
      seconds = s;
    }
  } else {
    clearInterval(timerSys);
    timerSys = false;
  }
  return ((!timerSys) ? "0" : t)
}

function sys() {
  t = new Date().setMilliseconds(seconds);

}

Пример I

Теперь вы можете добавить строку в функцию sys :

function sys() {
  t = new Date().setMilliseconds(seconds);
  console.log("Next execution: " + new Date(t));
//this is also the place where you put functions & code needed to happen when interval is triggerd

}

И выполнить:

  timer(5000);

Каждые 5 секунд в консоли:

  //output:: Next execution: Sun May 08 2016 11:01:05 GMT+0200 (Romance (zomertijd))

Пример II

function sys() {
  t = new Date().setMilliseconds(seconds);
  console.log("Next execution: " + seconds/1000 + " seconds");

}

$(function() {
  timer(5000);
});

Каждые 5 секунд в консоли:

      //output:: Next execution: 5 seconds

Пример III

var t, timerSys, seconds;

function timer(s) {
  if (s && typeof s === "number") {
    if (typeof timerSys === "boolean" || typeof timerSys === "undefined") {
      timerSys = setInterval(function() {
        sys();
      }, s);
      t = new Date().setMilliseconds(s);
      seconds = s;
    }
  } else {
    clearInterval(timerSys);
    timerSys = false;
  }
  return ((!timerSys) ? "0" : t)
}

function sys() {
  t = new Date().setMilliseconds(seconds);
  console.log("Next execution: " + seconds / 1000 + " seconds");

}

$(function() {
  timer(5000);

  $("button").on("click", function() {
    $("span").text(t - new Date());
  })
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>Freebeer</button>
<span></span>

Обратите внимание, что таким образом вы можете опуститься ниже 0

...