Es gibt zwei (meistens verwendete) Arten von Timerfunktionen in Javascript setTimeout
und setInterval
( andere )
Beide Methoden haben dieselbe Signatur. Sie übernehmen eine Rückruffunktion und die Verzögerungszeit als Parameter.
setTimeout
Wird nur einmal nach der Verzögerung ausgeführt, während setInterval
die Rückruffunktion nach jeder Verzögerung weiter aufgerufen wird.
Beide Methoden geben eine Ganzzahl-ID zurück, mit der sie gelöscht werden können, bevor der Timer abläuft.
clearTimeout
und clearInterval
diese beiden Methoden verwenden eine Ganzzahlkennung, die von den obigen Funktionen setTimeout
und zurückgegeben wirdsetInterval
Beispiel:
setTimeout
alert("before setTimeout");
setTimeout(function(){
alert("I am setTimeout");
},1000); //delay is in milliseconds
alert("after setTimeout");
Wenn Sie den obigen Code ausführen, werden Sie sehen, dass es Warnungen gibt before setTimeout
und after setTimeout
schließlich I am setTimeout
nach 1 Sekunde (1000 ms).
Was Sie dem Beispiel entnehmen können, ist, dass das setTimeout(...)
asynchron ist, was bedeutet, dass es nicht darauf wartet, dass der Timer abgelaufen ist, bevor es zur nächsten Anweisung übergeht, d. H.alert("after setTimeout");
Beispiel:
setInterval
alert("before setInterval"); //called first
var tid = setInterval(function(){
//called 5 times each time after one second
//before getting cleared by below timeout.
alert("I am setInterval");
},1000); //delay is in milliseconds
alert("after setInterval"); //called second
setTimeout(function(){
clearInterval(tid); //clear above interval after 5 seconds
},5000);
Wenn Sie den obigen Code ausführen, werden Sie sehen, dass er alarmiert before setInterval
und after setInterval
schließlich alarmiertI am setInterval
feststellen, ausgibt, 5 Mal nach 1 Sekunde (1000 ms), da das setTimeout den Timer nach 5 Sekunden löscht, oder alle 1 Sekunde erhalten Sie eine I am setInterval
unendliche Warnung .
Wie macht der Browser das intern?
Ich werde es kurz erklären.
Um zu verstehen, dass Sie über die Ereigniswarteschlange in Javascript Bescheid wissen müssen. Im Browser ist eine Ereigniswarteschlange implementiert. Immer wenn ein Ereignis in js ausgelöst wird, werden alle diese Ereignisse (wie Klick usw.) zu dieser Warteschlange hinzugefügt. Wenn Ihr Browser nichts auszuführen hat, nimmt er ein Ereignis aus der Warteschlange und führt es einzeln aus.
Nun, wenn Sie anrufen setTimeout
odersetInterval
Ihr Rückruf bei einem Timer im Browser registriert wird und dieser nach Ablauf der angegebenen Zeit zur Ereigniswarteschlange hinzugefügt wird, nimmt Javascript das Ereignis aus der Warteschlange und führt es aus.
Dies geschieht, weil die Javascript-Engine Single-Threaded ist und jeweils nur eine Sache ausführen kann. Sie können also kein anderes Javascript ausführen und Ihren Timer verfolgen. Aus diesem Grund sind diese Timer beim Browser registriert (Browser sind keine Single-Threaded-Timer) und können den Timer verfolgen und nach Ablauf des Timers ein Ereignis in die Warteschlange einfügen.
Gleiches gilt setInterval
nur in diesem Fall, wenn das Ereignis nach dem angegebenen Intervall immer wieder zur Warteschlange hinzugefügt wird, bis es gelöscht oder die Browserseite aktualisiert wird.
Hinweis
Der Verzögerungsparameter, den Sie an diese Funktionen übergeben, ist die minimale Verzögerungszeit für die Ausführung des Rückrufs. Dies liegt daran, dass der Browser nach Ablauf des Timers das Ereignis zur Warteschlange hinzufügt, die von der Javascript-Engine ausgeführt werden soll. Die Ausführung des Rückrufs hängt jedoch von Ihrer Ereignisposition in der Warteschlange ab. Da die Engine ein Single-Thread ist, werden alle Ereignisse in ausgeführt die Warteschlange eins nach dem anderen.
Daher kann es manchmal länger als die angegebene Verzögerungszeit dauern, bis Ihr Rückruf aufgerufen wird, insbesondere wenn Ihr anderer Code den Thread blockiert und ihm keine Zeit gibt, um zu verarbeiten, was sich in der Warteschlange befindet.
Und wie gesagt, Javascript ist ein einzelner Thread. Also, wenn Sie den Thread für lange blockieren.
Wie dieser Code
while(true) { //infinite loop
}
Ihr Benutzer erhält möglicherweise eine Nachricht, dass die Seite nicht antwortet .
setTimeout(function(){/*YourCode*/},1000);