Skip to content

Instantly share code, notes, and snippets.

@manast
Last active November 15, 2023 22:08
Show Gist options
  • Star 62 You must be signed in to star a gist
  • Fork 20 You must be signed in to fork a gist
  • Save manast/1185904 to your computer and use it in GitHub Desktop.
Save manast/1185904 to your computer and use it in GitHub Desktop.
Accurate Javascript setInterval replacement
function interval(duration, fn){
var _this = this
this.baseline = undefined
this.run = function(){
if(_this.baseline === undefined){
_this.baseline = new Date().getTime()
}
fn()
var end = new Date().getTime()
_this.baseline += duration
var nextTick = duration - (end - _this.baseline)
if(nextTick<0){
nextTick = 0
}
_this.timer = setTimeout(function(){
_this.run(end)
}, nextTick)
}
this.stop = function(){
clearTimeout(_this.timer)
}
}
@ihewro
Copy link

ihewro commented Apr 17, 2021

In the first time,it wait double douration, there is the fixed version and with the args:

export function Interval(fn,duration,...args){
    const _this = this;
    this.baseline = undefined

    this.run = function(flag){
        if(_this.baseline === undefined){
            _this.baseline = new Date().getTime() - duration
        }
        if (flag){
            fn(...args);
        }
        const end = new Date().getTime();
        _this.baseline += duration

        let nextTick = duration - (end - _this.baseline);
        if(nextTick<0){
            nextTick = 0
        }

        console.log(nextTick);
        _this.timer = setTimeout(function(){
            _this.run(true)
        }, nextTick)
    }

    this.stop = function(){
        clearTimeout(_this.timer)
    }
}

@docjojo
Copy link

docjojo commented Nov 15, 2023

Great tool!
Might want to have a look at https://github.com/docjojo/Timers

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment