2016-08-26 3 views
2

Ich muss ein Ereignis genau alle 1s generieren. Ich teste setTimeout-Funktion, wie folgend:Zeitempfindliche Anwendung in Javascript

window.onload = function() { 
     var oldTime = Date.now(); 

     setTimeout(function printTime() { 
      newTime = Date.now(); 
      console.log(newTime - oldTime); 
      oldTime = newTime; 
      setTimeout(printTime, 1000); 
     }, 1000); 
    } 

Es gibt 1s mit ein wenig versetzt:

testTimeout.js:6 1005 
testTimeout.js:6 1006 
2testTimeout.js:6 1001 
testTimeout.js:6 1006 
testTimeout.js:6 1005 
testTimeout.js:6 1006 
testTimeout.js:6 1005 

Wo kommt der Offset kommen? Liegt es an der oldTime- und newTime-Berechnung?

Antwort

3

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

+1

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

Verwandte Themen