web-dev-qa-db-fra.com

Puis-je voir si une minuterie fonctionne toujours?

Question simple ici pour laquelle je n'arrive pas à trouver de réponse: Une fois qu'un setTimeout est défini, y a-t-il un moyen de voir s'il est toujours, eh bien, défini?

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

D'après ce que je peux dire, lorsque vous clearTimeout, la variable reste à sa dernière valeur. UNE console.log Je viens de regarder les émissions Timer comme étant '12', peu importe si le délai a été défini ou effacé. Dois-je également annuler la variable ou utiliser une autre variable en tant que dicton booléen, oui, j'ai réglé ce minuteur? Il y a sûrement un moyen de vérifier simplement si le délai d'expiration est toujours en cours ... non? Je n'ai pas besoin de savoir combien de temps il reste, juste s'il fonctionne toujours.

61
Andrew

Il n'y a aucune façon d'interagir avec la minuterie, sauf pour la démarrer ou l'arrêter. J'annule généralement la variable timer dans le gestionnaire de timeout plutôt que d'utiliser un indicateur pour indiquer que le timer ne fonctionne pas. Il y a une belle description sur W3Schools sur le fonctionnement du minuteur. Dans leur exemple, ils utilisent une variable indicateur.

La valeur que vous voyez est une poignée de la minuterie actuelle, qui est utilisée lorsque vous la désactivez (l'arrêtez).

47
tvanfosson

Ce que je fais c'est:

var timer = null;

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

Pas besoin de vérifier la minuterie existante, effacez simplement Timimout avant de démarrer une minuterie.

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

cela effacera tout minuteur avant de démarrer une nouvelle instance.

5
Kapilrc

Définissez une autre variable Timer_Started = true avec votre minuterie. Et changez également la variable en false lorsque la fonction timer est appelée:

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

J'annule généralement le chronomètre:

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

Je sais que c'est un nécropostage mais je pense que les gens le recherchent toujours.

C'est ce que j'utilise: 3 variables:

  1. t pendant millisecondes depuis .. dans Objet Date pour la prochaine cible
  2. timerSys pour l'intervalle réel
  3. seconds seuil pour les millisecondes a été défini

ensuite j'ai un function timer avec 1 variable, la fonction vérifie si la variable est vraiment , si c'est le cas, il vérifie si la minuterie est déjà en cours d'exécution et si c'est le cas, remplit le vars globaux , sinon vraiment , faussement , efface l'intervalle et définit global var timerSys à faux;

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

}

Exemple I

Vous pouvez maintenant ajouter une ligne à la fonction 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

}

Et exécutez:

  timer(5000);

Toutes les 5 secondes dans la console:

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

Exemple II

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

}

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

Toutes les 5 secondes dans la console:

      //output:: Next execution: 5 seconds

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

Notez de cette façon que vous pouvez descendre en dessous de 0

1
Phil Andelhofs