2010-07-14 4 views
48

Simple question ici que je n'arrive pas à trouver une réponse pour: Une fois un setTimeout est réglé, est-il un moyen de voir si c'est encore, bien, définir?Puis-je voir si une minuterie est toujours en cours d'exécution?

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

D'après ce que je peux dire, quand vous clearTimeout, la variable reste à sa dernière valeur. A console.log Je viens de regarder les spectacles Timer comme étant «12», peu importe si le délai d'attente a été défini ou effacé. Dois-je aussi annuler la variable, ou utiliser une autre variable comme une expression booléenne, oui, j'ai réglé cette minuterie? Il existe sûrement un moyen de vérifier si le délai d'attente est toujours en cours ... n'est-ce pas? Je n'ai pas besoin de savoir combien de temps il reste, juste s'il fonctionne toujours.

Répondre

37

Il n'est pas nécessaire d'interagir avec la minuterie sauf pour la démarrer ou l'arrêter. Je annule généralement la variable de minuterie dans le gestionnaire de délai d'attente plutôt que d'utiliser un indicateur pour indiquer que le minuteur n'est pas en cours d'exécution. Il y a une belle description sur W3Schools sur le fonctionnement de la minuterie. Dans leur exemple, ils utilisent une variable d'indicateur.

La valeur que vous voyez est handle à la minuterie actuelle, qui est utilisée lorsque vous l'effacez (arrêtez).

+8

-1 patrick, ce n'est pas un principe mondain. parfois, ils ont des ressources utiles. – JoeRocc

+4

OT: le problème est de distinguer ces heures des autres :) Sans connaître le sujet, bien sûr – superjos

+0

"Je annule généralement la variable timer dans le délai d'attente" –

38

Ce que je fais est:

var timer = null; 

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

Utilisez 'setTimeout (yourFunction, 0)', plus sûr que 'setTimeout ('yourFunction()', 0) '. – cprcrack

+0

Ne fonctionne pas bien dans le monde asynchrone – Epirocks

+1

@Epirocks Même dans le monde asynchrone, Javascript est toujours mono-thread. – matpop

4

Définir une autre variable Timer_Started = true votre minuterie. Et aussi changer la variable à false lorsque la fonction de minuterie 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."); 
    } 

} 
1

Je sais que c'est un necroposting mais je pense que les gens recherchent cela.

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

  1. t millisecondes depuis ..Date d'objet pour la prochaine cible
  2. timerSys pour l'intervalle réel
  3. seconds seuil de millisecondes a été fixé

prochaine j'ai function timer avec 1 variable de la fonction vérifie si la variable est vraiment, le cas échéant il vérifie si la minuterie est déjà en cours d'exécution et si c'est le cas que remplit vars globales, sinon vraiment, faussement, efface l'intervalle et définir 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); 

} 

Exemple I

Maintenant, vous pouvez ajouter une ligne à 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écuter:

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 cette façon, vous pouvez aller au-dessous 0

1

J'annule habituellement la minuterie:

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

Pas besoin de vérifier la minuterie existante, juste clearTimout avant de commencer une minuterie .

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

Ceci effacera tout temporisateur avant de démarrer une nouvelle instance.

Questions connexes