Kann ich sehen, ob noch ein Timer läuft?

75

Einfache Frage hier, auf die ich scheinbar keine Antwort finde: Gibt setTimeoutes eine Möglichkeit zu sehen, ob a nach dem Festlegen noch festgelegt ist?

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

Nach allem, was ich Ihnen sagen kann clearTimeout, bleibt die Variable auf ihrem letzten Wert. A console.logIch habe Shows nur Timerals '12' angesehen, egal ob das Timeout eingestellt oder gelöscht wurde. Muss ich die Variable ebenfalls auf Null setzen oder eine andere Variable als boolesches Sprichwort verwenden: Ja, ich habe diesen Timer eingestellt? Sicher gibt es eine Möglichkeit, einfach zu überprüfen, ob das Timeout noch läuft ... richtig? Ich muss nicht wissen, wie lange noch übrig ist, nur wenn es noch läuft.

Andrew
quelle

Antworten:

54

Es gibt sowieso keine Möglichkeit, mit dem Timer zu interagieren, außer ihn zu starten oder zu stoppen. Normalerweise stelle ich die Timer-Variable im Timeout-Handler auf Null, anstatt ein Flag zu verwenden, um anzuzeigen, dass der Timer nicht ausgeführt wird. Auf W3Schools gibt es eine schöne Beschreibung der Funktionsweise des Timers. In ihrem Beispiel verwenden sie eine Flag-Variable.

Der angezeigte Wert ist ein Handle für den aktuellen Timer, der verwendet wird, wenn Sie ihn löschen (stoppen).

Tvanfosson
quelle
9
-1 Patrick, das ist kein weltliches Prinzip. manchmal haben sie nützliche Ressourcen.
4
OT: Das Problem ist, diese Zeiten von den anderen zu unterscheiden :) Ohne das Thema zu kennen, natürlich
Superjos
"Normalerweise mache ich die Timer-Variable im Timeout auf Null"
Faiz Mohamed Haneef
63

Was ich tue ist:

var timer = null;

if (timer != null) {
  window.clearTimeout(timer); 
  timer = null;
}
else {
  timer = window.setTimeout(yourFunction, 0);
}
Benny Neugebauer
quelle
2
Verwenden Sie setTimeout(yourFunction, 0), sicherer als setTimeout('yourFunction()', 0).
cprcrack
1
@Epirocks Auch in der asynchronen Welt ist Javascript immer noch Single-Threaded.
Matpop
Ich habe nur darauf hingewiesen, dass es schön wäre, wenn es eine Möglichkeit gäbe, den Timer zu fragen, ob er noch läuft. Ich hatte zu dieser Zeit eine Seite voller asynchroner Anfragen und fand diese Lösung oben etwas vereinfacht, kann mich aber nicht genug erinnern, um auf Details einzugehen, wünschte ich hätte.
Epirocks
warum löschst du und null? stellt clearTimeoutnicht sicher, dass es keinen Speicher belegt? Prost. (Entschuldigung, ich weiß, dass dies von vor Ewigkeiten ist)
1252748
2
@ 1252748, die Variable timerbehält ihren Wert (eine Timer-ID) auch dann bei, wenn sie window.clearTimeoutaufgerufen wird. Es ist also notwendig, es zurückzusetzen.
Benny Neugebauer
16

Es ist nicht erforderlich, nach einem vorhandenen Timer zu clearTimeoutsuchen. Führen Sie ihn einfach aus, bevor Sie den Timer starten.

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

Dadurch wird jeder Timer gelöscht, bevor eine neue Instanz gestartet wird.

Kapilrc
quelle
Funktioniert gut, genau wie ich gesucht habe. Danke. Diese Antwort verdient mehr positive Stimmen.
Stéphane Laurent
5

Stellen Sie Timer_Started = truemit Ihrem Timer eine andere Variable ein . Ändern Sie die Variable auch so, falsedass die Timer-Funktion aufgerufen wird:

// 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.");
   }

}
KDawg
quelle
2

Ich weiß, dass dies eine Nekropostierung ist, aber ich denke, dass die Leute immer noch danach suchen.

Dies ist, was ich benutze: 3 Variablen:

  1. t für Millisekunden seit .. im Datumsobjekt für das nächste Ziel
  2. timerSys für das tatsächliche Intervall
  3. seconds Schwellenwert für Millisekunden wurde festgelegt

nächste i a haben function timerdie Funktion überprüft , mit 1 Variable , wenn Variable ist wirklich , wenn ja er prüfen , ob Timer bereits läuft , und wenn dies der Fall ist, als füllt die globalen Variablen , wenn nicht wirklich , falsch , löscht das Intervall und Set global var timerSyszu falsch ;

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);

}

Beispiel I.

Jetzt können Sie der sys-Funktion eine Zeile hinzufügen :

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

}

Und ausführen:

  timer(5000);

Alle 5 Sekunden in der Konsole:

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

Beispiel II

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

}

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

Alle 5 Sekunden in der Konsole:

      //output:: Next execution: 5 seconds

Beispiel 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>

Beachten Sie, dass Sie auf diese Weise unter 0 gehen können

Phil Andelhofs
quelle
2

Normalerweise mache ich den Timer ungültig:

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!');
}
zanetu
quelle