typescript - Angular 4 setTimeout venter ikke


Jeg lager en Angular 4-app med TypeScript.

Jeg har en funksjon som må kjøres hvert 10. sekund til en spesifisert stoppbetingelse. Jeg laget en løkke med noe testkode som bruker setTimeout for å se om det ville fungere.

Min testkode:

public run() {
    let i = 0;
    while (i < 4) {
        setTimeout(this.timer,3000);
        i++;
    }
}

public timer(){
    console.log("done")
}

Men dette ser ut til å vente i 3 sekunder, eller så er nettleseren bare treg... og så skriver den ut 'ferdig' 4 ganger. Så koden fungerer ikke. Gjør jeg dette feil, eller finnes det andre muligheter for å gjøre denne typen ting?

Svar #1

Siden du bruker Angular, kan du sannsynligvis gjøre dette på en mye enklere måte ved å bruke takeWhile:

Observable.interval(10000)
    .takeWhile(() => !stopCondition)
    .subscribe(i => { 
        // This will be called every 10 seconds until `stopCondition` flag is set to true
    })

Svar #2

Ja, du gjør det feil: du har en løkke som sier 4 ganger på rad å kjøre timer() 3 sekunder senere, fra nå.

For å gjøre det du vil, må du endre tidspunktet for neste timer hver gang timer() blir kalt, eller, enklere, bruke setInterval():

let count = 0;
const interval = window.setInterval(() => {
    this.timer();
    count++;
    if (count >= 4) {
        window.clearInterval(interval);
    }
}, 3000); 

Merk at siden du bruker Angular, vil det være mye enklere å bruke observables:

Observable.interval(3000).take(4).subscribe(() => this.timer());

Relaterte artikler