打字稿睡眠


135

我正在使用Typescript在Angular 2中开发一个网站,我想知道是否存在一种实现thread.sleep(ms)功能的方法。

我的用例是在几秒钟后提交表单后重定向用户,这在html或javascript中非常容易,但是我不确定如何在Typescript中做到。

非常感谢,


8
Typescript是JavaScript的超集。因此,用JavaScript编写它,然后就可以了:您有了TypeScript解决方案。
JB Nizet

Answers:


202

您必须等待带有async/的TypeScript 2.0 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

在OLD JS中,您必须使用

setTimeout(YourFunctionName, Milliseconds);

要么

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

然而与所有主要的浏览器支持async/ await它已经过时了。

更新:TypeScript 2.1在此处async/await

只是不要忘了,Promise当您编译到ES5时(在Promise本身不可用的情况下),您需要实现。


1
更新异步/等待和ES5 / ES3的生成器支持已移至TypeScript 2.1
v-andrew

8
事件,无需等待,您可以执行delay(20000).then(()=> {
ZZZ Z

1
由于某种原因,这并没有为我工作await new Promise(resolve => setTimeout(resolve, 1000)).then(()=>console.log("fired"));,但这个工作await new Promise(resolve => setTimeout(()=>resolve(), 1000)).then(()=>console.log("fired"));
fjch1997

@ fjch1997,将其包装在async函数中。我添加了示例
v-andrew

2
“延迟”功能的声明不需要async关键字,因为它已经返回了promise。
SlavaSt,

91

这有效:(由于评论)

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

1
为了简单起见,我认为现在应该是一个可以接受的答案。
显示名

1
@StefanFalk嗨,Stefan。我接受了另一个答案,因为它包含了这个答案,并且还有其他“打字”延迟的方式,这可能是其他人感兴趣的。我个人在整个代码中都使用了该代码,因为使用async / await处理此特定任务没有任何好处,但我不是TS纯粹主义者,我会选择更容易/更易理解的代码,所以我同意你的观点原则上 :)。

30

由于某种原因,以上接受的答案在新版本的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.
});

只需将您的“ 1000”替换为ms参数调用,那将是完美的。
greenskin

15

RxJS

import { timer } from 'rxjs';

// ...

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

x 是0。

如果提供一个第二个参数periodtimer,一个新的数将被发射的各period毫秒(X = 0,则x = 1,X = 2,...)。

有关更多详细信息,请参见官方文档


3
感谢这个观点,来到这里找到“可观察的方式”
user230910

0

如果您使用的是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秒后消失,并发出咆哮声。


0
import { timer } from 'rxjs';

await timer(1000).take(1).toPromise();

这对我来说更好


类型“ Observable <number>”上不存在属性“ take”。
安东·杜赞科

从“ rxjs / operators”导入{take};
FabioLux

-3

而不是声明一个函数,只需:

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

为什么没有功能?
Naveen Kumar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.