How to create an accurate timer in javascript?

前端 未结 10 2127
一个人的身影
一个人的身影 2020-11-22 01:32

I need to create a simple but accurate timer.

This is my code:

var seconds = 0;
setInterval(function() {
timer.innerHTML = seconds++;
}, 1000);
         


        
10条回答
  •  无人及你
    2020-11-22 02:35

    This is an old question but figured I'd share some code I use sometimes:

    function Timer(func, delay, repeat, runAtStart)
    {
        this.func = func;
        this.delay = delay;
        this.repeat = repeat || 0;
        this.runAtStart = runAtStart;
    
        this.count = 0;
        this.startTime = performance.now();
    
        if (this.runAtStart)
            this.tick();
        else
        {
            var _this = this;
            this.timeout = window.setTimeout( function(){ _this.tick(); }, this.delay);
        }
    }
    Timer.prototype.tick = function()
    {
        this.func();
        this.count++;
    
        if (this.repeat === -1 || (this.repeat > 0 && this.count < this.repeat) )
        {
            var adjustedDelay = Math.max( 1, this.startTime + ( (this.count+(this.runAtStart ? 2 : 1)) * this.delay ) - performance.now() );
            var _this = this;
            this.timeout = window.setTimeout( function(){ _this.tick(); }, adjustedDelay);
        }
    }
    Timer.prototype.stop = function()
    {
        window.clearTimeout(this.timeout);
    }
    

    Example:

    time = 0;
    this.gameTimer = new Timer( function() { time++; }, 1000, -1);
    

    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. Comes in handy.

    Edit: Note, this doesn't do any input checking (like if delay and repeat are the correct type. 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.

提交回复
热议问题