2010-07-14 10 views
48

Domanda semplice a cui non riesco a trovare una risposta: una volta impostato setTimeout, c'è un modo per vedere se è ancora, beh, impostato?Posso vedere se un timer è ancora in esecuzione?

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

Da quello che posso dire, quando si clearTimeout, la variabile rimane al suo ultimo valore. A console.log Ho appena guardato gli spettacoli Timer come "12", non importa se il timeout è stato impostato o cancellato. Devo annullare anche la variabile, o usare qualche altra variabile come un detto booleano, sì, ho impostato questo timer? Sicuramente c'è un modo per controllare se il timeout è ancora in esecuzione ... giusto? Non ho bisogno di sapere quanto tempo rimane, solo se è ancora in esecuzione.

risposta

37

Non è comunque possibile interagire con il timer tranne che avviarlo o interromperlo. In genere, annullo la variabile del timer nel gestore di timeout anziché utilizzare un flag per indicare che il timer non è in esecuzione. C'è una bella descrizione su W3Schools su come funziona il timer. Nel loro esempio usano una variabile flag.

Il valore visualizzato è un handle per il timer corrente, che viene utilizzato quando si deseleziona (lo interrompe).

+8

-1 patrick, questo non è un principio mondano. a volte hanno risorse utili. – JoeRocc

+4

OT: il problema è distinguere quelle volte dagli altri :) Senza conoscere l'argomento, ovviamente – superjos

+0

"Normalmente annullo la variabile timer nel timeout" –

38

Quello che faccio è:

var timer = null; 

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

Usa 'setTimeout (yourFunction, 0)', più sicuro di 'setTimeout ('yourFunction()', 0) '. – cprcrack

+0

Non funziona bene nel mondo asincrono – Epirocks

+1

@Epirocks Anche nel mondo asincrono, Javascript è ancora single threaded. – matpop

4

Impostare un'altra variabile Timer_Started = true con il timer. E anche modificare la variabile per false quando la funzione timer si chiama:

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

So che questo è un necroposting ma penso ancora persone sono alla ricerca di questo.

Questo è quello che uso: 3 variabili:

  1. t per millisecondi dal ..Data Oggetto per prossimo obiettivo
  2. timerSys per l'intervallo effettivo
  3. seconds soglia per millisecondi è stata fissata

prossimo ho un function timer con 1 variabile la funzione verifica se la variabile è veramente, in caso affermativo si controlla se il timer è già in esecuzione e se questo è il caso che riempie le vars globali, se non veramente, falsamente, cancella l'intervallo e impostareDaa 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); 

} 

esempio I

ora è possibile aggiungere una riga al funzione 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 

} 

ed eseguire:

timer(5000); 

Ogni 5 secondi in console:

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

Esempio II

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

} 

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

Ogni 5 secondi in console:

 //output:: Next execution: 5 seconds 

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

Nota questo modo si può andare al di sotto di 0

1

Io di solito annullare il timer:

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

Non c'è bisogno di verificare la presenza di timer esistente, proprio clearTimout prima di iniziare un timer .

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

questo cancellerà qualsiasi timer prima di iniziare una nuova istanza.

Problemi correlati