Je développe un site Web dans Angular 2 en utilisant TypeScript et je me demandais s'il existait un moyen d'implémenter la fonctionnalité thread.sleep(ms)
.
Mon cas d'utilisation est de rediriger les utilisateurs après la soumission d'un formulaire après quelques secondes, ce qui est très facile en html ou en javascript, mais je ne suis pas sûr de savoir comment le faire dans TypeScript.
Merci beaucoup,
Vous devez attendre TypeScript 2.0 avec async
await
pour la prise en charge de ES5, car il est désormais pris en charge uniquement pour la compilation TS à ES6.
Vous pourrez créer une fonction de délai avec async
:
async function delay(ms: number) {
return new Promise( resolve => setTimeout(resolve, ms) );
}
Et appelle ça
await delay(300);
Veuillez noter que vous pouvez utiliser await
uniquement dans la fonction async
.
Si vous ne pouvez pas (_/supposons que vous construisez une application nodejs), placez simplement votre code dans la fonction anonyme async
. Voici un exemple:
(async () => {
// Do something before delay
console.log('before delay')
await delay(1000);
// Do something after
console.log('after delay')
})();
En JS, vous devez utiliser
setTimeout(YourFunctionName, Milliseconds);
ou
setTimeout( () => { /*Your Code*/ }, Milliseconds );
Mettre à jour: TypeScript 2.1 est ici avec
async/await
.
N'oubliez surtout pas que vous avez besoin de la mise en œuvre Promise
lorsque vous compilez vers ES5, où Promise n'est pas disponible de manière native.
Cela fonctionne: (merci aux commentaires)
setTimeout(() =>
{
this.router.navigate(['/']);
},
5000);
Pour une raison quelconque, la réponse acceptée ci-dessus ne fonctionne pas dans les nouvelles versions de Angular (V6).
pour cela utiliser ceci ..
async delay(ms: number) {
await new Promise(resolve => setTimeout(()=>resolve(), ms)).then(()=>console.log("fired"));
}
ci-dessus a fonctionné pour moi.
Usage:
this.delay(3000);
OU de manière plus précise
this.delay(3000).then(any=>{
//your task after delay.
});
Avec RxJS
:
const delay_observable = of('').pipe(delay( * your delay in ms * ));
delay_observable.subscribe(s => { *your action here* });
// Rest of the code continues to execute, your action will be done when time comes
Et vous devez inclure correctement les directives RxJS. En angulaire par exemple, vous aurez besoin de:
import { Observable, of } from 'rxjs';
import { delay } from 'rxjs/operators';
Ou plutôt que de déclarer une fonction, simplement:
setTimeout(() => { console.log('hello'); }, 1000);
Si vous utilisez angular5 et supérieur, veuillez inclure la méthode ci-dessous dans votre fichier ts.
async delay(ms: number) {
await new Promise(resolve => setTimeout(()=>resolve(), ms)).then(()=>console.log("fired"));
}
appelez ensuite cette méthode delay () où vous voulez.
par exemple:
validateInputValues() {
if (null == this.id|| this.id== "") {
this.messageService.add(
{severity: 'error', summary: 'ID is Required.'});
this.delay(3000).then(any => {
this.messageService.clear();
});
}
}
Ce message disparaîtra après 3 secondes.