Подтвердить что ты не робот

Typescript сон

Я разрабатываю веб-сайт в Angular 2 с помощью Typescript, и мне было интересно, есть ли способ реализовать функциональность thread.sleep(ms).

Моим вариантом использования является перенаправление пользователей после отправки формы через несколько секунд, что очень просто в html или javascript, но я не уверен, как это сделать в Typescript.

Большое спасибо,

4b9b3361

Ответ 1

Вы должны ждать TypeScript 2.0 с async/await для поддержки ES5, так как теперь он поддерживается только для компиляции TS в ES6.

Вы сможете создать функцию задержки с помощью async:

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

И назови это

await delay(300);

Обратите внимание, что вы можете использовать await только внутри функции async.

Если вы не можете (скажем, вы создаете приложение nodejs), просто поместите свой код в анонимную функцию async. Вот пример:

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

        await delay(1000);

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

Пример применения TS: https://github.com/v-andrew/ts-template

В JS вы должны использовать

setTimeout(YourFunctionName, Milliseconds);

или

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

Обновить: TypeScript 2.1 здесь с async/await.

Только не забывайте, что вам нужна реализация Promise при компиляции в ES5, где Promise изначально недоступен.

Ответ 2

Это работает: (благодаря комментариям)

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

Ответ 3

По некоторым причинам принятый выше ответ не работает в новых версиях Angular (V6).

для этого используйте это..

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

выше работал для меня.

Использование:

this.delay(3000);

ИЛИ более точный способ

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

Ответ 4

С 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

И вам нужно правильно включить директивы RxJS. Например, в Angular вам потребуется:

import { Observable, of } from 'rxjs';
import { delay } from 'rxjs/operators';

Ответ 5

Если вы используете angular5 и выше, пожалуйста, включите метод ниже в вашем файле TS.

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

затем вызывайте этот метод delay() где угодно.

например:

validateInputValues() {
    if (null == this.id|| this.id== "") {
        this.messageService.add(
            {severity: 'error', summary: 'ID is Required.'});
        this.delay(3000).then(any => {
            this.messageService.clear();
        });
    }
}

Это сообщение исчезнет через 3 секунды.

Ответ 6

Или вместо того, чтобы объявлять функцию, просто:

setTimeout(() => {
    console.log('hello');
}, 1000);