webentwicklung-frage-antwort-db.com.de

TypeScript setTimeout-Schleife, die diesen Fehler übergibt

Versuchen Sie, eine Timer-Schleife in TypeScript zu erstellen:

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

Aber nachdem die erste Schleife korrekt funktioniert, erhalte ich den folgenden Fehler: "Uncaught TypeError: this.timeout ist keine Funktion". Es scheint, dass diese Variable nach der ersten Schleife nicht existiert. Irgendwelche Ideen?

8
Ben Hayward

Weil Ihr this nicht auf das Objekt verweist. Jede Funktion hat ihre eigenen. Ihre this ist also diejenige, die durch anonyme Funktion innerhalb der setTimeout() definiert wird.

Um Ihr Programm zum Laufen zu bringen, müssen Sie die this vor dem Timeout halten und in dieser Variablen verwenden.

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


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

Oder Sie können mit lambda functions Arbeiten, wodurch die this für Ihr Objekt beibehalten wird. Lamda verweist mit this auf die this des äußeren Objekts ], die die Lambda-Funktion aufrufen`.

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


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

Dadurch geht der Zusammenhang verloren. Verwenden Sie die Pfeilfunktion, dies ist besser.

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