Ich brauche ein Ereignis von exakt 1 s zu erzeugen.
Es gibt keine Möglichkeit, dies mit exakter Genauigkeit zu tun.
Die Zeit verging setTimeout
ist die minimale garantierte Zeit, in der Ihr Code ausgeführt wird, nicht die genaue Zeit.
Es stellt in wie viele Millisekunden die JS-Engine, um diese Funktion der Event Queue vorantreiben wird. Sobald die Funktion ist in der Ereigniswarteschlange, es läuft, nachdem alle aktuellen Aufgaben in der Warteschlange, wie Ereignisse und andere Zeitgeber, die eine Verzögerung erzeugen wird.
Zusätzlich kann keine Aufgabe aus der Ereigniswarteschlange ausgeführt werden, während jeder regulärer JS Code ausgeführt wird, die auch potentiell kleine Verzögerungen schaffen könnte.
Zum Beispiel diese Funktion test
:
setTimeout(function test() {
console.log('second');
}, 0);
for (i = 0; i < 1000000; i++); // the number 1000000 is an arbitrary big number
console.log('first');
Wird ausgeführt, nachdem die Schleife unterhalb der Vorgang abgeschlossen ist, die weg mehr als 0
Millisekunden sein.
In der Tat, wenn die Schleife unendlich war, der setTimeout
Rückruf wird nie ausgelöst.
Hinweis: Wie Nnnnnn in den Kommentaren erwähnt, die tatsächliche Mindestzeit, als per the HTML5 spec, in denen setTimeout
wird eine Funktion für die Ereigniswarteschlange drücken ist 4 ms, unabhängig davon, ob wir weniger setzen. Zuvor war dieses Limit 10ms.
MDN
In der Tat, 4 ms wird durch die Spezifikation HTML5 spezifiziert und ist in allen Browsern 2010 veröffentlicht und weiter konsequent. Vor (Firefox 5.0/Thunderbird 5.0/SeaMonkey 2.2) war der minimale Timeout-Wert für verschachtelte Timeouts 10 ms. genaue * Zeit
Mit anderen Worten: Sie können * * keine Funktion bei einem * einplanen. (Auch im Hinblick auf die 0ms Timeout, auch ohne eine lange laufende Schleife nach es noch mindestens 4ms, bevor es läuft, weil Browser runden kleinere Verzögerungen bis zu 4ms - obwohl Ihr Punkt über anderen Code, der zuerst zu beenden muss steht noch.) – nnnnnn