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

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


当前回答

你必须等待带有async/await的TypeScript 2.0来获得ES5支持,因为它现在只支持TS到ES6的编译。

你可以使用async创建延迟函数:

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

并称之为

await delay(1000);

顺便说一下,你可以直接等待Promise:

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

请注意,你只能在async函数中使用await。

如果你不能(假设你正在构建nodejs应用程序),就把你的代码放在匿名异步函数中。这里有一个例子:

    (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);

or

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

然而,由于每个主流浏览器都支持async/await,所以它就不那么有用了。

更新: TypeScript 2.1带有async/await。

不要忘记,当你编译到ES5时,你需要Promise实现,而在ES5中,Promise并不是本地可用的。

PS

如果您想在原始文件之外使用该函数,则必须导出该函数。

其他回答

你也可以使用RxJS:

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

async yourFunction() {
    yourCode;
    await this.delay(5000);
    yourCode;
}

delay(ms: number): Promise<any> {
    const dummyObservable = of();
    return dummyObservable.pipe(delay(ms)).toPromise();
}

这是有效的:(感谢评论)

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

你必须等待带有async/await的TypeScript 2.0来获得ES5支持,因为它现在只支持TS到ES6的编译。

你可以使用async创建延迟函数:

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

并称之为

await delay(1000);

顺便说一下,你可以直接等待Promise:

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

请注意,你只能在async函数中使用await。

如果你不能(假设你正在构建nodejs应用程序),就把你的代码放在匿名异步函数中。这里有一个例子:

    (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);

or

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

然而,由于每个主流浏览器都支持async/await,所以它就不那么有用了。

更新: TypeScript 2.1带有async/await。

不要忘记,当你编译到ES5时,你需要Promise实现,而在ES5中,Promise并不是本地可用的。

PS

如果您想在原始文件之外使用该函数,则必须导出该函数。

或者不声明一个函数,简单地说:

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

RxJS:

import { timer } from 'rxjs';

// ...

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

X = 0。

如果你给timer第二个参数period,每一周期毫秒就会产生一个新的数字(x = 0然后x = 1, x = 2,…)

详见官方文档。