2010-06-29 15 views
164

setTimeout() Die Benutzung ist möglich, eine Funktion zu einem bestimmten Zeitpunkt zu starten:Aufruf eine Funktion alle 60 Sekunden

setTimeout(function, 60000); 

Aber was, wenn ich möchte die Funktion mehrmals starten? Jedes Mal, wenn ein Zeitintervall verstreicht, möchte ich die Funktion ausführen (etwa alle 60 Sekunden).

Antwort

279

Wenn Sie sich nicht, wenn der Code innerhalb der timer länger als Ihr Intervall dauern kann, verwenden setInterval():

setInterval(function, delay) 

, dass die Funktion übergibt als erste Parameter über und über abfeuert.

Ein besserer Ansatz ist, zu verwenden setTimeout zusammen mit einer self-executing anonymous Funktion:

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

, die garantiert, dass der nächste Anruf nicht gemacht wird, bevor der Code ausgeführt wurde. Ich habe arguments.callee in diesem Beispiel als Funktionsreferenz verwendet. Es ist eine bessere Art und Weise der Funktion einen Namen und rufen zu geben, dass innerhalb setTimeout weil arguments.callee in ECMAScript ist veraltet 5.

+4

Es ist nicht möglich, den nächsten Anruf zu tätigen, bevor der Code beendet wird. Der Timer zählt asynchron herunter, aber der Callback muss in die Warteschlange gestellt werden. Dies bedeutet, dass Ihr Rückruf nach mehr als 60 Sekunden ausgelöst werden kann (und wahrscheinlich auch wird). –

+12

Der Unterschied besteht darin, dass setInterval wird in der Regel die Funktion x Millisekunden, nachdem das ** ** der vorherigen Iteration beginnen, wobei hier der Ansatz wird die nächste Iteration x Millisekunden nach dem vorherigen Laufe ** ** beenden – Gareth

+1

@Andy E Kopf , @Gareth: Gareth hat recht, dieser Ansatz vermeidet nur, dass der Schleifencode ausgeführt wird, während ein anderer Codeblock noch läuft. – jAndy

51

verwenden, um die

setInterval(function, 60000); 

EDIT: (Im Fall, wenn Sie die Uhr stoppen wollen, nachdem es gestartet wird)

Script Abschnitt

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

und HTML-Code

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

In diesem Fall, wie würden Sie es von der Wiederholung stoppen, nachdem es zu wiederholen begonnen hatte? –

+0

ist es einfach. Ich werde die Antwort dafür aktualisieren. – BlueBird

5
setInterval(fn,time) 

ist die Methode, die Sie suchen.

14

Eine bessere Nutzung von jAndy ‚s answer eine Abfragefunktion, die Umfragen alle interval Sekunden, und endet nach timeout Sekunden zu implementieren.

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

Gemäß dem Kommentar, es für die Fähigkeit der übergebenen Funktion der Aktualisierung der Abfrage zu stoppen:

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

Wie würden Sie das Polling innerhalb von 'sendHeartBeat' stoppen? – temuri

+1

@temuri, aktualisierte Antwort –

+1

Dies ist ein gutes Beispiel! Wenn Sie Timer verwenden, ist es schwieriger, Komponententests zu schreiben, aber mit diesem Ansatz - es ist einfach –

5

Sie können einfach SetTimeout am Ende des Anrufes Funktion. Dies fügt es erneut der Ereigniswarteschlange hinzu. Sie können jede Art von Logik verwenden, um die Verzögerungswerte zu variieren.Zum Beispiel

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

Es gibt 2 Möglichkeiten

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

  2. setInterval(functionName, 60000);

oben Funktion der Call auf alle 60 Sekunden anrufen wird.

5

In jQuery können Sie wie folgt tun.

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

Die Nummer wird mehr oder weniger alle 12 Sekunden erneuert - sollte das nicht eine Minute sein? – Max

+1

siehe Kommentar '// Change Interval hier zum Testen. Zum Beispiel: 5000 für 5 Sekunden. Momentan ist es eingestellt, alle 6 Sekunden zu wechseln. Verwenden Sie für eine Minute den Wert 60000 –

Verwandte Themen