289 votes

Comment implémenter la fonction sleep en TypeScript ?

Je développe un site web dans Angular 2 en utilisant TypeScript et je me demandais s'il y avait un moyen d'implémenter thread.sleep(ms) fonctionnalité.

Mon cas d'utilisation est de rediriger les utilisateurs après avoir soumis un formulaire après quelques secondes, ce qui est très facile en JavaScript mais je ne suis pas sûr de savoir comment le faire en TypeScript.

12 votes

Typescript est un surensemble de JavaScript. Il suffit donc de l'écrire en JavaScript pour obtenir une solution TypeScript.

0 votes

Les choses se sont simplifiées depuis la première réponse à cette question. Voir aussi stackoverflow.com/a/39914235/328817

524voto

v-andrew Points 7022

Il faut attendre TypeScript 2.0 avec async / await pour la prise en charge d'ES5, car elle n'est désormais prise en charge que pour la compilation de TS à ES6.

Vous pouvez créer une fonction de retardement avec async :

function delay(ms: number) {
    return new Promise( resolve => setTimeout(resolve, ms) );
}

Et l'appeler

await delay(1000);

BTW, vous pouvez attendre sur Promise directement :

await new Promise(f => setTimeout(f, 1000));

Veuillez noter que vous pouvez utiliser await uniquement à l'intérieur async fonction.

Si vous ne pouvez pas ( Imaginons que vous construisiez une application nodejs ), il suffit de placer votre code dans le fichier anonyme async fonction. Voici un exemple :

    (async () => { 
        // Do something before delay
        console.log('before delay')

        await delay(1000);

        // Do something after
        console.log('after delay')
    })();

Exemple d'application TS : https://github.com/v-andrew/ts-template

Dans OLD JS, vous devez utiliser

setTimeout(YourFunctionName, Milliseconds);

ou

setTimeout( () => { /*Your Code*/ }, Milliseconds );

Toutefois, comme tous les principaux navigateurs prennent en charge les async / await il est moins utile.

Mise à jour : TypeScript 2.1 est disponible avec async/await .

N'oubliez pas que vous avez besoin Promise lorsque vous compilez en ES5, où Promise n'est pas disponible nativement.

PS

Vous devez exporter la fonction si vous souhaitez l'utiliser en dehors du fichier original.

1 votes

Mise à jour : support des async/await et des générateurs pour ES5/ES3 a été déplacé vers TypeScript 2.1

9 votes

Sans await, vous pouvez faire delay(20000).then(()=>{

1 votes

Pour une raison quelconque, cela n'a pas fonctionné pour moi await new Promise(resolve => setTimeout(resolve, 1000)).then(()=>console.log("fired")); mais cela a fonctionné await new Promise(resolve => setTimeout(()=>resolve(), 1000)).then(()=>console.log("fired"));

169voto

kha Points 8318

Cela fonctionne : (merci aux commentaires)

setTimeout(() => 
{
    this.router.navigate(['/']);
},
5000);

4 votes

Je suppose que, par souci de simplicité, cette réponse devrait maintenant être acceptée.

2 votes

@StefanFalk Bonjour Stefan. J'ai accepté l'autre réponse parce qu'elle incluait cette réponse et qu'elle présentait également d'autres façons plus "typographiques" d'effectuer le délai, ce qui pourrait intéresser d'autres personnes. Personnellement, j'utilise celle-ci dans tout mon code car je ne vois aucun avantage à utiliser async/await pour cette tâche spécifique, mais je ne suis pas un puriste TS et j'opte pour ce qui est le plus facile/le plus lisible, donc je suis d'accord avec vous sur le principe :).

1 votes

Je l'ai heurté. Propre et efficace.

36voto

MarmiK Points 3384

Pour une raison quelconque, la réponse acceptée ci-dessus ne fonctionne pas dans les nouvelles versions d'Angular (V6).

pour l'utilisation de ce

async delay(ms: number) {
    await new Promise(resolve => setTimeout(()=>resolve(), ms)).then(()=>console.log("fired"));
}

ci-dessus a fonctionné pour moi.

Utilisation :

this.delay(3000);

OU de manière plus précise

this.delay(3000).then(any=>{
     //your task after delay.
});

0 votes

Remplacez simplement votre '1000' par un appel de paramètre ms et ce sera parfait.

29voto

Mic Points 1318

Con RxJS :

import { timer } from 'rxjs';

// ...

timer(your_delay_in_ms).subscribe(x => { your_action_code_here })

x est de 0.

Si vous donnez un deuxième argument period a timer un nouveau numéro sera émis chaque period millisecondes (x = 0 puis x = 1, x = 2, ...).

Voir le document officiel pour plus de détails.

3 votes

Merci pour cette perspective, je suis venu ici pour trouver la "voie observable"

0 votes

C'est la solution la plus propre. Merci.

1voto

Jag Points 16

Si vous utilisez angular5 et plus, 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"));
}

puis appelez 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();
        });
    }
}

Le message disparaît après 3 secondes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X