2010-06-29 14 views
164

Utilizzando setTimeout() è possibile lanciare una funzione in un determinato periodo di tempo:Chiamare una funzione ogni 60 secondi

setTimeout(function, 60000); 

Ma cosa succede se vorrei lanciare la funzione più volte? Ogni volta che passa un intervallo di tempo, vorrei eseguire la funzione (ogni 60 secondi, diciamo).

risposta

279

Se non si cura se il codice all'interno del timer potrebbe richiedere più tempo del vostro intervallo, utilizzare setInterval():

setInterval(function, delay) 

che spara la funzione passata come primo parametro più e più volte.

Un approccio migliore è, per usare setTimeout insieme a una funzione di self-executing anonymous:

(function(){ 
    // do some stuff 
    setTimeout(arguments.callee, 60000); 
})(); 

che garantisce, che il prossimo chiamata non viene effettuata prima è stato eseguito il codice. Ho usato arguments.callee in questo esempio come riferimento di funzione. È un modo migliore per assegnare un nome alla funzione e chiamarla entro setTimeout perché arguments.callee è obsoleto in ecmascript 5.

+4

Non è possibile effettuare la prossima chiamata prima che il codice termini l'esecuzione. Il timer esegue il conto alla rovescia in modo asincrono ma la richiamata deve essere accodata. Ciò significa che il tuo callback potrebbe (e probabilmente lo farà) sparare dopo più di 60 secondi. –

+12

La differenza è che setInterval eseguirà generalmente la funzione x millisecondi dopo il ** start ** della precedente iterazione, mentre l'approccio qui eseguirà la successiva iterazione x millisecondi dopo quella precedente ** terminato ** – Gareth

+1

@Andy E's head , @Gareth: Gareth ha ragione, quell'approccio evita solo che il codice di loop venga eseguito mentre un altro codice è ancora in esecuzione. – jAndy

51

utilizzare l'EDIT

setInterval(function, 60000); 

: (Nel caso in cui, se si vuole fermare l'orologio dopo che è stato avviato)

sezione Script

<script> 
var int=self.setInterval(function, 60000); 
</script> 

e codice HTML

<!-- Stop Button --> 
<a href="#" onclick="window.clearInterval(int);return false;">Stop</a> 
+0

In questo caso, come è possibile impedire che ripetere dopo che aveva iniziato a ripetere? –

+0

è semplice. Aggiornerò la risposta per questo. – BlueBird

5
setInterval(fn,time) 

è il metodo che stai cercando.

14

Un migliore utilizzo dei jAndy s' answer per implementare una funzione di polling che i sondaggi ogni interval secondi, e termina dopo timeout secondi.

function pollFunc(fn, timeout, interval) { 
    var startTime = (new Date()).getTime(); 
    interval = interval || 1000; 

    (function p() { 
     fn(); 
     if (((new Date).getTime() - startTime) <= timeout) { 
      setTimeout(p, interval); 
     } 
    })(); 
} 

pollFunc(sendHeartBeat, 60000, 1000); 

UPDATE

Come per il commento, l'aggiornamento per la capacità della funzione passata per fermare il polling:

function pollFunc(fn, timeout, interval) { 
    var startTime = (new Date()).getTime(); 
    interval = interval || 1000, 
    canPoll = true; 

    (function p() { 
     canPoll = ((new Date).getTime() - startTime) <= timeout; 
     if (!fn() && canPoll) { // ensures the function exucutes 
      setTimeout(p, interval); 
     } 
    })(); 
} 

pollFunc(sendHeartBeat, 60000, 1000); 

function sendHeartBeat(params) { 
    ... 
    ... 
    if (receivedData) { 
     // no need to execute further 
     return true; // or false, change the IIFE inside condition accordingly. 
    } 
} 
+0

Come fermeresti il ​​polling all'interno di "sendHeartBeat'? – temuri

+1

@temuri, risposta aggiornata –

+1

Questo è un buon esempio! Quando usi i timer è più difficile scrivere test di unità, ma con questo approccio - è facile –

5

si può semplicemente chiamare setTimeout alla fine del funzione. Questo lo aggiungerà di nuovo alla coda degli eventi. È possibile utilizzare qualsiasi tipo di logica per variare i valori di ritardo.Ad esempio,

function multiStep() { 
    // do some work here 
    blah_blah_whatever(); 
    var newtime = 60000; 
    if (!requestStop) { 
    setTimeout(multiStep, newtime); 
    } 
} 
0

Ci sono 2 modi per Chiamata-

  1. setInterval(function(){ functionName();}, 60000);

  2. setInterval(functionName, 60000);

sopra funzione inviterà ogni 60 secondi.

5

In jQuery puoi fare così.

function random_no(){ 
 
    var ran=Math.random(); 
 
    jQuery('#random_no_container').html(ran); 
 
} 
 
      
 
window.setInterval(function(){ 
 
     /// call your function here 
 
     random_no(); 
 
}, 6000); // Change Interval here to test. For eg: 5000 for 5 sec
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div id="random_no_container"> 
 
     Hello. Here you can see random numbers after every 6 sec 
 
</div>

+0

Il numero si rinnova più o meno ogni 12 secondi - non dovrebbe essere un minuto? – Max

+1

vedi il commento '// Cambia intervallo qui per testare. Ad esempio: 5000 per 5 sec. Attualmente è impostato per cambiare ogni 6 secondi. usa il valore 60000 per un minuto –