4

I am learning Typescript and am trying to print a console message a number of times over a period of time. But in my test this happens once, you know the reason?

The code is below:

 class Class {
    private msg: string;
    constructor(msg: string) {
        this.msg = msg;
    }
    private printMsg(): void {
        console.log(this.msg);
    };
    public repeatMsg(): void {
        let intervalo = setInterval(this.printMsg(), 2000);
        setTimeout(function() {
            clearInterval(intervalo);
        }, 40000);
    }
}

let test: Class;
test = new Class("Hello");
test.repeatMsg();
unional
  • 14,651
  • 5
  • 32
  • 56
Sávio Raires
  • 159
  • 2
  • 5
  • 11
  • 4
    Remove the `()`, you're calling the function immediately, `setInterval` expects a function reference, like you provided via anonymous function in the timeout – Sterling Archer Mar 04 '18 at 03:05
  • 2
    Possible duplicate of [Calling functions with setTimeout()](https://stackoverflow.com/questions/3800512/calling-functions-with-settimeout) – Sterling Archer Mar 04 '18 at 03:06
  • Removing `()` would break `this.msg`. Using `this.pringMsg.bind(this)` would work though. – Jake Holzinger Mar 04 '18 at 03:14

1 Answers1

15

The problem in your code is there:

setInterval(this.printMsg(), 2000);

setInterval accepts a function as a first parameter. Expression this.printMsg() is a call of the function, and is void actually. There are two ways to fix it. Use lambda:

setInterval(() = > this.printMsg(), 2000);

Or use bind:

setInterval(this.printMsg.bind(this), 2000);
Jake Worth
  • 5,490
  • 1
  • 25
  • 35
Pavel
  • 2,602
  • 1
  • 27
  • 34