808 Stimmen

setTimeout oder setInterval?

Soweit ich das beurteilen kann, verhalten sich diese beiden Teile von Javascript auf die gleiche Weise:

Option A:

function myTimeoutFunction()
{
    doStuff();
    setTimeout(myTimeoutFunction, 1000);
}

myTimeoutFunction();

Option B:

function myTimeoutFunction()
{
    doStuff();
}

myTimeoutFunction();
setInterval(myTimeoutFunction, 1000);

Gibt es einen Unterschied zwischen der Verwendung von setTimeout y setIntervall ?

6 Stimmen

Wenn Sie möchten einige gute Details, wie Timer in JS arbeiten, schrieb John Resig eine gute Artikel zu diesem Thema

9 Stimmen

Es gibt auch den offensichtlichen Unterschied, dass setTimeout diese zusätzliche Codezeile erfordert, um sie weiterzugeben, was den Nachteil hat, dass es ein Wartungsproblem ist, aber den Vorteil, dass Sie den Zeitraum leicht ändern können

0 Stimmen

Versuchen Sie dies jsfiddle.net/pramendra/Y4vEV

2voto

Maaz Punkte 3953

Ich füge nur hinzu, was bereits gesagt wurde, aber die setTimeout-Version des Codes erreicht auch die Maximum call stack size was dazu führt, dass es nicht mehr funktioniert. Da es für die rekursive Funktion keinen Basisfall gibt, an dem sie anhalten kann, können Sie sie nicht ausführen lassen für immer.

1voto

Max M. Punkte 51

Wenn Sie das Intervall in setInterval zu kurz ist, kann sie ausgelöst werden, bevor der vorherige Aufruf der Funktion abgeschlossen ist. Ich hatte dieses Problem mit einem aktuellen Browser (Firefox 78). Es führte dazu, dass die Garbage Collection den Speicher nicht schnell genug freigeben konnte und ein riesiges Speicherleck entstand. Verwendung von setTimeout(function, 500); gab der Garbage Collection genügend Zeit, um aufzuräumen und den Speicher über die Zeit stabil zu halten.

Serg Hospodarets hat das Problem in seiner Antwort erwähnt, und ich stimme seinen Ausführungen voll und ganz zu, aber er hat das Speicherleck/Garbage Collection-Problem nicht erwähnt. Ich hatte auch das Problem des Einfrierens, aber die Speichernutzung stieg in kürzester Zeit auf 4 GB für eine winzige Aufgabe, was für mich der eigentliche Knaller war. Daher denke ich, dass diese Antwort auch für andere in meiner Situation von Nutzen ist. Ich hätte sie in einen Kommentar geschrieben, aber mir fehlt die Reputation, um das zu tun. Ich hoffe, es macht Ihnen nichts aus.

0voto

Einsteinium Punkte 64

Der Grund dafür Option A y Option B dass sie gleich zu funktionieren scheinen, liegt vor allem daran, dass die Orte der setInterval y el setTimeout Funktionen.

function myTimeoutFunction()
{
    doStuff();
    setTimeout(myTimeoutFunction, 1000);
}

myTimeoutFunction();

Dies ist eine rekursive Funktion, und wenn doStuff ist sehr komplex, setTimeout muss den Überblick über alle Aufrufe der setTimout plus die aktuelle doStuff was es zu einem Langsamer y s l o w e r .

function myTimeoutFunction()
{
    doStuff();
}

myTimeoutFunction();
setInterval(myTimeoutFunction, 1000);

Auf der anderen Seite ist die setInterval muss nur noch die letzte setInterval und die aktuelle doStuff so dass der Aufenthalt in einem Konstante Geschwindigkeit.

Welche sollten Sie also verwenden?

Aus den obigen Ausführungen können Sie wahrscheinlich schließen, dass die bessere Lösung die folgende ist setInterval .

0voto

Manar Gul Punkte 163

Der wichtigste Punkt ist die Leistung. Die einzige Möglichkeit, eine Funktion periodisch auszuführen, ist setTimeout ist es, es rekursiv mit der Zielfunktion aufzurufen, und wenn Sie es überprüfen, scheint es, dass es asynchron arbeitet, wenn Sie den Aufrufstapel sehen, werden Sie feststellen, dass er mit der Zeit immer größer wird. In der Tat ist das sinnvoll. Da Javascript kein Multi-Threading unterstützt, ist es unmöglich, den Aufruf der übergeordneten Funktion zu beenden, bevor die untergeordnete Funktion beendet ist, daher wird der Stapel weiter wachsen, solange es einen rekursiven Aufruf gibt. Während, mit setInterval brauchen wir die Zielfunktion nicht rekursiv aufzurufen, da sie über eine Logik verfügt, die sie in regelmäßigen Abständen als Schleife durchläuft. Auf diese Weise bleibt der Aufrufstapel sauber. Sie können den Aufrufstapel mit den Entwicklertools in Ihrem Browser beobachten und werden den Unterschied bemerken.

Der Unterschied wird deutlich, wenn kleine Intervalle über einen längeren Zeitraum verwendet werden.

-5voto

Ich glaube SetInterval y SetTimeout sind unterschiedlich. SetInterval führt den Block nach der dabei eingestellten Zeit aus, SetTimeout führt den Codeblock einmal aus.

Versuchen Sie diese Codes nach dem Timeout-Countdown-Sekunden:

setInterval(function(e){
    alert('Ugbana Kelvin');
}, 2000);

und versuchen dann

setTimeout(function(e){
    alert('Ugbana Kelvin');
}, 2000);

Sie können sich selbst von den Unterschieden überzeugen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X