web-dev-qa-db-fra.com

TypeScript setTimeout loop passant cette erreur

Essayer de créer une boucle de temporisation dans TypeScript:

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

Mais après que la première boucle fonctionne correctement, j'obtiens cette erreur: "Uncaught TypeError: this.timeout n'est pas une fonction". Il semble que la variable this n'existe pas après la boucle initiale. Des idées?

8
Ben Hayward

Parce que votre this ne fait pas référence à l'objet. Chaque fonction a son propre ça. Ainsi, votre this est celui qui est défini par une fonction anonyme à l'intérieur de la setTimeout().

Pour faire fonctionner votre programme, vous devez maintenir le this avant le délai d'expiration et utiliser à travers cette variable.

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


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

Ou vous pouvez travailler avec lambda functions, qui gardera le this dans votre objet. Le Lamda de this fera référence au this de l'outreur, qui appelle la fonction lambda`.

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


let t = new Test();
t.timeout();
27
Suren Srapyan

À cause de ce contexte est perdu. Utilisez la fonction flèche, c'est mieux.

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