web-dev-qa-db-ja.com

タイマーがまだ実行されているかどうかを確認できますか?

ここでの答えを見つけることができないという簡単な質問:setTimeoutが設定されたら、それがまだ設定されているかどうかを確認する方法はありますか?

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

私が言えることから、clearTimeoutの場合、変数は最後の値のままです。 console.logタイムアウトが設定またはクリアされているかどうかに関係なく、Timerが「12」であることを示しただけです。変数も無効にする必要がありますか、それとも他の変数をブール値として使用する必要がありますか、はい、このタイマーを設定しましたか?タイムアウトがまだ実行されているかどうかを確認する方法は確かにあります...どれだけの時間が残っているかを知る必要はありません、それがまだ動作している場合だけです。

61
Andrew

とにかくタイマーを操作するのは、タイマーを開始または停止する以外にはありません。通常、タイマーが実行されていないことを示すフラグを使用するのではなく、タイムアウトハンドラーのタイマー変数をnullにします。 W3Schools にはタイマーの仕組みについての素敵な説明があります。それらの例では、フラグ変数を使用しています。

表示されている値は、現在のタイマーの handle であり、これをクリア(停止)するときに使用されます。

47
tvanfosson

私がやることは:

var timer = null;

if (timer != null) {
  window.clearTimeout(timer); 
  timer = null;
}
else {
  timer = window.setTimeout(yourFunction, 0);
}
51

既存のタイマーを確認する必要はありません。タイマーを開始する前に、Timoutをクリアするだけです。

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

これにより、新しいインスタンスを開始する前にタイマーがクリアされます。

5
Kapilrc

別の変数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.");
   }

}
4
KDawg

私は通常、タイマーを無効にします:

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

これはネクロポストであることは知っていますが、まだ人々はこれを探していると思います。

これは私が使用するものです:3つの変数:

  1. tからのミリ秒。次のターゲットのDateオブジェクト
  2. timerSysは実際の間隔
  3. secondsミリ秒のしきい値が設定されました

次に、function timer変数が1の場合、関数は変数がtrulyであるかどうかをチェックします。そうであれば、タイマーが既に実行されているかどうか、およびグローバルvarstrulyfalselyでない場合、間隔をクリアしてglobal var timerSys to 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 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