2009-12-29 5 views
11

Wie behandelt setInterval Callback-Funktionen, die länger als das gewünschte Intervall dauern?setInterval und lange laufende Funktionen

Ich habe gelesen, dass der Rückruf möglicherweise die Anzahl der Millisekunden spät als sein erstes Argument erhalten, aber ich konnte nicht finden, warum es zu spät wäre (Jitter oder lange laufende Funktionen).

Und die wunderbare Follow-up, verhält es sich anders für die gängigen Browser?

+0

Gute Frage. Ich würde vermuten, dass die Antwort Browser-spezifisch ist. Sollten wir einige Tests durchführen, um das herauszufinden? –

+0

Ich würde nicht auf Argumente für den Rückruf erhalten. Verwenden Sie stattdessen einen einfachen Datumsvergleich. Das scheint mir der zuverlässigste und browserübergreifende Ansatz zu sein. –

Antwort

14

mir eine ausgezeichnete article über Timer, die von John Resig Lassen Sie zitieren:

setTimeout(function(){ 
    /* Some long block of code... */ 
    setTimeout(arguments.callee, 10); 
}, 10); 

setInterval(function(){ 
    /* Some long block of code... */ 
}, 10); 

Diese beiden Teile des Codes erscheinen zu funktionell gleichwertig sein, auf den ersten Blick , aber sie sind es nicht. Bemerkenswert ist der SetTimeout Code immer an mindestens eine 10 ms Verzögerung nach der vorherige Rückruf Ausführung hat (es kann mehr am Ende wird, aber weniger nie), während die setInterval wird versuchen, einen Rückruf ausführt jeden 10ms unabhängig davon, wann der letzte Callback wurde ausgeführt.

Intervalle können ohne Verzögerung sofort ausgeführt werden, wenn sie lange genug dauern, um ausgeführt zu werden (länger als die angegebene Verzögerung).

+4

Kurz gesagt, da das JavaScript-Threading ausschließlich single threaded ist, können die Callbacks nicht parallel ausgeführt werden. Perfekt. –