var clock = eFakeTimers(now) Īs above, but rather than starting the clock with a timestamp of 0, start at the provided timestamp now. Starts the clock at the UNIX epoch (timestamp of 0). ) įake timers API var clock = eFakeTimers() Ĭauses Sinon to replace the global setTimeout, clearTimeout, setInterval, clearInterval, setImmediate, clearImmediate, process.hrtime, performance.now(when available) and Date with a custom implementation which is bound to the returned clock object. Set of features (Sinon uses it under the hood) and was previously extracted from Sinon.JS. Or Date.now() (if supported by the browser).įor standalone usage of fake timers it is recommended to use fake-timers package instead. Sinon.JS can overwrite the global functions with to allow you to more easilyįake timers provide a clock object to pass time, which can also be used to control Date objects created through either new Date() Var diffInSeconds = Math.floor((new Date() - this.Fake timers are synchronous implementations of setTimeout and friends that Since setInterval is not reliable in inactive windows/tabs we are using date diff. And you'd probably want to add some kind of get/set function if you wanted to get the count or change the repeat value. Comes in handy.Įdit: Note, this doesn't do any input checking (like if delay and repeat are the correct type. Self-corrects the setTimeout, can run it X number of times (-1 for infinite), can start running instantaneously, and has a counter if you ever need to see how many times the func() has been run. * Self-adjusting interval to account for drifting I've wrapped it up into a constructor function so we can do 'objecty' things with it. I'ma just build on Bergi's answer (specifically the second part) a little bit because I really liked the way it was done, but I want the option to stop the timer once it starts (like clearInterval() almost). SetTimeout(step, Math.max(0, interval - dt)) // take into account drift possibly special handling to avoid futile "catch up" run Var dt = Date.now() - expected // the drift (positive for overshooting) Here the exact delay for each of the repeated timeouts is adapted to the actually elapsed time, compared to the expected intervals: var interval = 1000 // ms Those are known as self-adjusting timers. This requires a bit more advanced strategy (and code), though it pays out well (and registers less timeouts). However, sometimes you really need a steady interval executing your callbacks without drifting. So it would be advisable to update more often, like about every 100ms, to avoid such jumps. When the interval lags a bit and executes your callback after 990, 1993, 2996, 3999, 5002 milliseconds, you will see the second count 0, 1, 2, 3, 5 (!). Now, that has the problem of possibly jumping values. alternatively just show wall clock time: ![]() Output(Math.floor(delta / 1000)) // in seconds ![]() ![]() Var delta = Date.now() - start // milliseconds elapsed since start Then base your logic on the current time value, instead of counting how often your callback has been executed.įor a simple timer or clock, keep track of the time difference explicitly: var start = Date.now() Use the Date object instead to get the (millisecond-)accurate, current time. ![]() They are allowed to lag arbitrarily, and they do not keep a constant pace but tend to drift (as you have observed). They cannot be trusted, there are no accuracy guarantees for them. Because you are using setTimeout() or setInterval().
0 Comments
Leave a Reply. |