Здесь простой вопрос, на который я не могу найти ответ: как только setTimeout установлен, есть ли способ узнать, все еще, хорошо, установлен?

if (!Timer)
{
    Timer = setTimeout(DoThis,60000);
}

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

80
Andrew 14 Июл 2010 в 18:32

6 ответов

Лучший ответ

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

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

51
tvanfosson 14 Июл 2010 в 14:39

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

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

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

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

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 :

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 .

1
Phil Andelhofs 8 Май 2016 в 09:20

Установите другую переменную 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.");
   }

}
5
Jonathan Marzullo 11 Фев 2016 в 20:27

Что я делаю:

var timer = null;

if (timer != null) {
  window.clearTimeout(timer); 
  timer = null;
}
else {
  timer = window.setTimeout(yourFunction, 0);
}
56
Benny Neugebauer 1 Фев 2016 в 14:26

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

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
zanetu 25 Авг 2016 в 04:23

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

var timer;
//..
var startTimer = function() {
  clearTimeout(timer);
  timer = setTimeout(DoThis, 6000);
}

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

9
Crimbo 25 Сен 2019 в 11:27