JSFiddle - React, Tailwind, and code Playground

by alicemunro

JavaScript

function CountdownTimer(totalMs, totalTicks, tickCb) {

    var ret = {}, startTime, ticksCompleted;

    function tick() {
      if (ticksCompleted == totalTicks) { onFinish(); return; }
      ticksCompleted++;
      tickCb(ticksCompleted);
      setTimeout(function() {tick()}, optimalPauseTime());
    }

    function optimalPauseTime() {
      var timeElapsed = new Date() - startTime;
      var avgTickTimeSoFar = timeElapsed / ticksCompleted;
      var ticksRemaining = totalTicks - ticksCompleted;
      var timeRemaining = totalMs - timeElapsed;
      return timeRemaining / ticksRemaining;
    }

    function start() { 
        startTime = new Date(); 
        ticksCompleted = 0;
        tick(); 
    }
    
    function onFinish() {
      console.log(new Date() - startTime);
    }

    ret.start = start;
    return ret;
}

timer = CountdownTimer(5000, 5, function(tickNum) { console.log(tickNum) });
timer.start();