angular - Hvordan implementere en søvnfunksjon i TypeScript?
Jeg utvikler et nettsted i Angular 2 ved hjelp av TypeScript, og jeg lurte på om det finnes en måte å implementere thread.sleep(ms)-funksjonalitet på.
Mitt bruksområde er å omdirigere brukerne etter å ha sendt inn et skjema etter noen sekunder, noe som er veldig enkelt i JavaScript, men jeg er ikke sikker på hvordan jeg gjør det i TypeScript.
Svar #1
Du må vente på TypeScript 2.0 med async/await for ES5-støtte, da det nå bare støttes for TS til ES6-kompilering.
Du vil kunne lage en forsinkelsesfunksjon med async:
function delay(ms: number) {
return new Promise( resolve => setTimeout(resolve, ms) );
}
Og kall det
await delay(1000);
Forresten, du kan vente på Promise direkte:
await new Promise(f => setTimeout(f, 1000));
Vennligst merk at du kun kan bruke await inne i en async-funksjon.
Hvis du ikke kan (la oss si at du bygger en Node.js-applikasjon), plasser bare koden din i den anonyme async-funksjonen. Her er et eksempel:
(async () => {
// Do something before delay
console.log('before delay')
await delay(1000);
// Do something after
console.log('after delay')
})();
Eksempel TS-applikasjon: https://github.com/v-andrew/ts-template
I GAMMEL JS må du bruke
setTimeout(YourFunctionName, Milliseconds);
eller
setTimeout( () => { /*Your Code*/ }, Milliseconds );
Men med at alle større nettlesere støtter async/await er det mindre nyttig.
Oppdatering: TypeScript 2.1 er her med
async/await.
Bare ikke glem at du trenger Promise-implementering når du kompilerer til ES5, hvor Promise ikke er tilgjengelig nativt.
PS
Du må eksportere funksjonen hvis du vil bruke den utenfor den opprinnelige filen.
Svar #2
Dette fungerer: (takk til kommentarene)
setTimeout(() =>
{
this.router.navigate(['/']);
},
5000);
Svar #3
Av en eller annen grunn fungerer ikke det ovennevnte aksepterte svaret i nye versjoner av Angular (V6).
for det, bruk dette..
async delay(ms: number) {
await new Promise(resolve => setTimeout(()=>resolve(), ms)).then(()=>console.log("fired"));
}
ovenfor fungerte for meg.
Bruk:
this.delay(3000);
ELLER mer nøyaktig måte
this.delay(3000).then(any=>{
//your task after delay.
});
Svar #4
Med RxJS:
import { timer } from 'rxjs';
// ...
timer(your_delay_in_ms).subscribe(x => { your_action_code_here })
x er 0.
Hvis du gir et andre argument period til timer, vil et nytt tall bli sendt ut hvert period millisekund (x=0, deretter x=1, x=2, ...).
Se den offisielle dokumentasjonen for flere detaljer.
Svar #5
Eller i stedet for å erklære en funksjon, ganske enkelt:
setTimeout(() => {
console.log('hello');
}, 1000);
Svar #6
import { timer } from 'rxjs';
import { take } from 'rxjs/operators';
await timer(1000).pipe(take(1)).toPromise();
dette fungerer bedre for meg
Svar #7
Den riktige måten å gjøre det på fra ES6 er
import { setTimeout } from 'timers/promises';
await setTimeout(5000);
Det er den native Node-metoden nå. https://nodejs.org/api/timers.html
