2017-03-29 5 views
0

Ich versuche, ein Stück Code genau jede Sekunde auszuführen. Ich stelle jedoch fest, dass es zwischen jedem Durchlauf des setInterval einen> 1000ms Zeitunterschied gibt.Wie bekomme ich setInterval, um genau alle n Millisekunden auszuführen?

var incrementUnitCount = function() { 

    var now = new Date(); 

    console.log('Shift' + now + 'ms' + now.getMilliseconds()); 

}; 

setInterval(incrementUnitCount2, interval); 

Die Ausgabe sieht wie folgt aus:

js/schedule.js (148) :ShiftTue Mar 28 2017 21:44:05 GMT-0400 (EDT)ms457 
js/schedule.js (148) :ShiftTue Mar 28 2017 21:44:06 GMT-0400 (EDT)ms458 
js/schedule.js (148) :ShiftTue Mar 28 2017 21:44:07 GMT-0400 (EDT)ms460 
js/schedule.js (148) :ShiftTue Mar 28 2017 21:44:08 GMT-0400 (EDT)ms463 
js/schedule.js (148) :ShiftTue Mar 28 2017 21:44:09 GMT-0400 (EDT)ms465 
js/schedule.js (148) :ShiftTue Mar 28 2017 21:44:10 GMT-0400 (EDT)ms468 
js/schedule.js (148) :ShiftTue Mar 28 2017 21:44:11 GMT-0400 (EDT)ms468 
js/schedule.js (148) :ShiftTue Mar 28 2017 21:44:12 GMT-0400 (EDT)ms470 
js/schedule.js (148) :ShiftTue Mar 28 2017 21:44:13 GMT-0400 (EDT)ms472 

Wie gezeigt, zwischen jedem Anruf die Zeitdifferenz 1001ms ist, nicht 1000. Wenn ich eine zeitkritische Anwendung haben, wie kann ich eine Garantie Anruf alle 1000 ms - so etwas wie dieses:

js/schedule.js (148) :ShiftTue Mar 28 2017 21:44:12 GMT-0400 (EDT)ms470 
js/schedule.js (148) :ShiftTue Mar 28 2017 21:44:13 GMT-0400 (EDT)ms470 

Danke!

+2

Sie können nicht. Was ist die Anwendung? Brauchen Sie eigentlich ein genaues Intervall oder nur eines, das nicht abdriftet? – Ryan

+0

Sie können nicht. Die meisten modernen Benutzer-orientierten Betriebssysteme sind nicht in der Lage, diese Planungsgenauigkeit zu erreichen. –

+0

Hmm, ich denke ich verstehe den Unterschied nicht? Ich denke, ich brauche keinen, der driftet? Ich habe einen Akkumulator, um die gesamte Zeitdauer zu messen, die nach der Drift in die nächste Sekunde aus ist. – Julian

Antwort

0

Sie können nicht, aber Sie können möglicherweise eine genauere (nicht exakte) Ersetzung setInterval mit requestAnimationFrame. Von https://gist.github.com/joelambert/1002116

window.requestInterval = function(fn, delay) { 
    if(!window.requestAnimationFrame  && 
     !window.webkitRequestAnimationFrame && 
     !(window.mozRequestAnimationFrame && window.mozCancelRequestAnimationFrame) && // Firefox 5 ships without cancel support 
     !window.oRequestAnimationFrame  && 
     !window.msRequestAnimationFrame) 
      return window.setInterval(fn, delay); 

    var start = new Date().getTime(), 
     handle = new Object(); 

    function loop() { 
     var current = new Date().getTime(), 
      delta = current - start; 

     if(delta >= delay) { 
      fn.call(); 
      start = new Date().getTime(); 
     } 

     handle.value = requestAnimFrame(loop); 
    }; 

    handle.value = requestAnimFrame(loop); 
    return handle; 
} 
0

beendet I pre-Berechnung ein Array von Datetime-Werte und ich nur die aktuelle Zeit gegen die Anordnung prüfen die Spuren der Zeit zu halten.

Danke!

Verwandte Themen