Typescript сон
Я разрабатываю веб-сайт в Angular 2 с помощью Typescript, и мне было интересно, есть ли способ реализовать функциональность thread.sleep(ms)
.
Моим вариантом использования является перенаправление пользователей после отправки формы через несколько секунд, что очень просто в html или javascript, но я не уверен, как это сделать в Typescript.
Большое спасибо,
Ответы
Ответ 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);