Typescript Sleep


136

Typescriptを使用してAngular 2でWebサイトを開発していますが、thread.sleep(ms)機能を実装する方法があるかどうか疑問に思っていました。

私のユースケースは、数秒後にフォームを送信した後にユーザーをリダイレクトすることです。これは、htmlまたはjavascriptで非常に簡単ですが、Typescriptでそれを行う方法がわかりません。

どうもありがとう、


8
TypescriptはJavaScriptのスーパーセットです。JavaScriptで記述すれば、TypeScriptソリューションがあります。
JB Nizet

回答:


203

ES5のサポートでは、TSからES6へのコンパイルでのみサポートされるため、TypeScript 2.0をasync/ awaitで待機する必要があります。

あなたは遅延関数を作成することができるでしょう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ます。

PromisePromiseをネイティブで利用できないES5にコンパイルする場合は、実装が必要であることを忘れないでください。


1
更新ES5 / ES3の非同期/待機およびジェネレーターのサポートは TypeScript 2.1に移動されました
v-andrew

8
イベントを待つことなく、delay(20000)を実行できます。then(()=> {
ZZZ

1
何らかの理由でこれはうまくawait new Promise(resolve => setTimeout(resolve, 1000)).then(()=>console.log("fired"));await new Promise(resolve => setTimeout(()=>resolve(), 1000)).then(()=>console.log("fired"));
いき

@ fjch1997、それをasync関数でラップします。私は例を追加しました
v-andrew

2
「delay」関数の宣言は、すでにpromiseを返すため、asyncキーワードを必要としません。
SlavaSt

91

これは機能します:(コメントのおかげで)

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

1
簡単にするために、これは今では受け入れられる答えになるはずです。
displayname

1
@StefanFalkこんにちはステファン。私は他の回答を受け入れました。これにはこの回答が含まれており、他の人にとって興味があるかもしれない、遅延を実行する他のより「タイプスクリプト」的な方法もあったためです。私はコード全体でこれを個人的に使用していますが、この特定のタスクに非同期/待機を使用するメリットは見られませんが、私はTS純粋主義者ではなく、より簡単で読みやすいものを使用するので、同意します原則として :)。
kha

31

何らかの理由で、上記の承認された回答は、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パラメータ呼び出しに置き換えるだけで完璧です。
グリーンスキン

15

RxJS

import { timer } from 'rxjs';

// ...

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

x は0です。

に2番目の引数periodを指定するtimerと、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秒後にメッセージのうなりを消します。



-3

または、関数を宣言するのではなく、単に:

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

なぜ関数ではないのですか?
Naveen Kumar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.