Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeScript setTimeout loop passing this error

Trying to create a timer loop in TypeScript:

timeout() {
    setTimeout(function () {
        console.log('Test');
        this.timeout();
    }, 1000/60);
}

But after the first loop works correctly I'm getting this error: "Uncaught TypeError: this.timeout is not a function". It seems that the this variable does not exist after the initial loop. Any ideas?

like image 946
Ben Hayward Avatar asked Jan 20 '17 12:01

Ben Hayward


Video Answer


2 Answers

Because your this doesn't refer to the object. Every function has it's own this. So your this is the one which is defined by anonymous function inside the setTimeout().

To make your program work, you need to hold the this before the timeout and use throught that variable.

class Test {
  
  timeout() {
      var that = this;
      setTimeout(function () {
          console.log('Test');
          that.timeout();
      }, 1000/60);
  } 
  
}


let t = new Test();
t.timeout();

Or you can work with lambda functions, which will keep the this to your object.Lamda's this will refer to the outer's this, which call the lambda function`.

class Test {
      
   timeout() {
       setTimeout(() => {
           console.log('Test');
           this.timeout();
       }, 1000/60);
   } 
      
}


let t = new Test();
t.timeout();
like image 187
Suren Srapyan Avatar answered Sep 24 '22 10:09

Suren Srapyan


Because of this context is lost. Use the arrow function this is better.

timeout() {
    setTimeout(() => {
        console.log('Test');
        this.timeout();
    }, 1000/60);
}
like image 41
Smiranin Avatar answered Sep 22 '22 10:09

Smiranin