Search code examples
typescriptsettimeoutcountdown

Simple Countdown Timer Typescript


I have the following code in my constructor:

constructor(){
for (let i = 0; i < 90; i++) {
  setTimeout(() => {
    this.counter = this.counter - 1;
  }, 1000)
 }
}

What I actually want is to display a number which counts down 90 seconds. Right now it counts down from 90 to 0 immediately


Solution

  • You can use setInterval instead to make the function be called every 1 second until the counter reaches 0:

    class Timer {
        constructor(public counter = 90) {
    
            let intervalId = setInterval(() => {
                this.counter = this.counter - 1;
                console.log(this.counter)
                if(this.counter === 0) clearInterval(intervalId)
            }, 1000)
        }
    }
    

    Or if you want something that looks like a for and uses setTimeout you could use async/await and Promisses (admittedly this might be overkill for this simple example):

    function delay(delay: number) {
        return new Promise(r => {
            setTimeout(r, delay);
        })
    }
    class Timer {
        constructor(public counter = 90) {
            this.doTimer();
        }
        async doTimer() {
            for (let i = 0; i < this.counter; i++) {
                await delay(1000);
                this.counter = this.counter - 1;
                console.log(this.counter);
            }
        }
    }