Sueño de Typescript


Estoy desarrollando un sitio web en Angular 2 usando Typescript y me preguntaba si había una manera de implementar la funcionalidad thread.sleep(ms).

Mi caso de uso es redirigir a los usuarios después de enviar un formulario después de unos segundos, lo cual es muy fácil en html o javascript, pero no estoy seguro de cómo hacerlo en Typescript.

Muchas gracias,

Author: Antikhippe, 2016-06-11

3 answers

Tienes que esperar a TypeScript 2.0 con async/await para compatibilidad con ES5, ya que ahora solo admite la compilación de TS a ES6.

Usted sería capaz de crear la función de retardo para las funciones asincrónicas:

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

Y llámalo

await delay(300);

Tenga en cuenta que puede usar await solo dentro de la función async.

Si no puedes (digamos que estás construyendo la aplicación nodejs), simplemente coloca tu código en la función anonymous async. Aquí está un ejemplo:

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

    await delay(1000);

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

En JS tienes que usar

setTimeout(YourFunctionName, Milliseconds);

O

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

Actualizar: TypeScript 2.1 está aquí con async/await.

Simplemente no olvide que necesita Promise implementación cuando compila a ES5, donde Promise no está disponible de forma nativa.

 59
Author: v-andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-23 18:27:05

Esto funciona: (gracias a los comentarios)

setTimeout(() => 
{
    this.router.navigate(['/']);
},
5000);
 25
Author: kha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-11 14:17:15

Por alguna razón la respuesta aceptada anteriormente no funciona en las Nuevas versiones de Angular (V6).

Para eso usa esto..

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

Arriba funcionó para mí.

Uso:

this.delay(3000);

O de manera más precisa

this.delay(3000).then(any=>{
     //your task after delay.
});
 4
Author: MarmiK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-24 13:50:46