打字稿睡觉

kha*_*kha 93 typescript angular

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

我的用例是在几秒钟之后提交表单后重定向用户,这在html或javascript中非常容易,但我不知道如何在Typescript中执行此操作.

非常感谢,

v-a*_*rew 144

您必须等待具有async/ awaitfor ES5支持的TypeScript 2.0,因为它现在仅支持TS到ES6编译.

您可以使用以下命令创建延迟功能async:

function delay(ms: number) {
    return new Promise( resolve => setTimeout(resolve, ms) );
}
Run Code Online (Sandbox Code Playgroud)

并称之为

await delay(300);
Run Code Online (Sandbox Code Playgroud)

请注意,您只能使用await内部async功能.

如果你不能(假设你正在构建nodejs应用程序),只需将代码放在匿名async函数中.这是一个例子:

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

        await delay(1000);

        // Do something after
        console.log('after delay')
    })();
Run Code Online (Sandbox Code Playgroud)

在JS中你必须使用

setTimeout(YourFunctionName, Milliseconds);
Run Code Online (Sandbox Code Playgroud)

要么

setTimeout( () => { /*Your Code*/ }, Milliseconds );
Run Code Online (Sandbox Code Playgroud)

更新:TypeScript 2.1随附async/await.

只是不要忘记Promise在编译到ES5时需要实现,其中Promise本身不可用.

  • 没有等待的事件,你可以做延迟(20000).then(()=> { (7认同)
  • 'delay'函数的声明不需要async关键字,因为它已经返回了promise。 (2认同)

kha*_*kha 71

这有效:(感谢评论)

setTimeout(() => 
{
    this.router.navigate(['/']);
},
5000);
Run Code Online (Sandbox Code Playgroud)

  • 为了简单起见,我想这个答案现在应该是公认的答案。 (2认同)
  • @StefanFalk 嗨,Stefan。我接受了另一个答案,因为它包含了这个答案,并且还有其他更“打字稿”的延迟方式,其他人可能会感兴趣。我个人在整个代码中都使用了这个,因为我认为使用 async/await 来完成这个特定任务没有任何好处,但我不是 TS 纯粹主义者,我会选择更容易/更易读的东西,所以我同意你的看法原则上 :)。 (2认同)

Mar*_*miK 19

出于某种原因,上述接受的答案在新版本的Angular(V6)中不起作用.

为此使用此..

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

以上为我工作.

用法:

this.delay(3000);
Run Code Online (Sandbox Code Playgroud)

或更准确的方式

this.delay(3000).then(any=>{
     //your task after delay.
});
Run Code Online (Sandbox Code Playgroud)


Mic*_*Mic 9

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
Run Code Online (Sandbox Code Playgroud)

并且您需要正确包含RxJS指令。例如,在Angular中,您需要:

import { Observable, of } from 'rxjs';
import { delay } from 'rxjs/operators';
Run Code Online (Sandbox Code Playgroud)

  • 感谢这种观点,来到这里寻找“可观察的方法” (2认同)

小智 9

Or rather than to declare a function, simply:

setTimeout(() => {
    console.log('hello');
}, 1000);
Run Code Online (Sandbox Code Playgroud)


Sch*_*ltz 8

ES6 中正确的做法是

import { setTimeout } from 'timers/promises';

await setTimeout(5000);
Run Code Online (Sandbox Code Playgroud)

现在它是本机节点方法。https://nodejs.org/api/timers.html

  • timers/promises 是仅限 Node.js 的 API。它不能在浏览器代码中使用。 (2认同)

Fab*_*Lux 7

import { timer } from 'rxjs';

await timer(1000).pipe(take(1)).toPromise();
Run Code Online (Sandbox Code Playgroud)

这对我更有效