2017-12-29 39 views
1

毎秒update()関数を実行したいとしましょう。setIntervalの代わりにJavaScript asyncを使用する

私は2つの方法でそれを行うことができます。

async function interval() { 
    await new Promise((res, req) => { 
    setTimeout(res, 1000) 
    }) 
    update() 
    interval() 
} 

または

setInterval(update, 1000) 

2間のいずれかの機能的な違いはありますか?

+1

お約束使用する場合には、間隔をキャッチすることができます。 '間隔を()キャッチ(ERR => ...)'あなたは 'setInterval'をキャンセルすることができますが、' Promise'をキャンセル傾ける – HMR

+1

実装 –

答えて

0

あなたのinterval関数は、終了時に約束を返します。あなたはそれが正しく動作していることかかわらreturnを追加する必要があります。

async function interval() { 
    await new Promise((res, req) => { 
    setTimeout(res, 1000) 
    }) 
    update() 
    return interval() 
//^^^^^^ 
} 

updateが例外をスローした場合さて、約束は拒否され、エラーを .catch()することができます。また、 setIntervalとは対照的に、 interval再帰呼び出しは実行を停止します。

またasync/await構文はあなたがループを作成するために、再帰を避けることができるという利点があります:あなたの質問は繰り返しを達成するためのsetTimeoutとのsetIntervalの間の差を求めている

async function interval() { 
    while (true) { 
    await new Promise((res, req) => { 
     setTimeout(res, 1000) 
    }) 
    update() 
    } 
} 
+0

更新が例外をスローすると、約束は拒否されません!,約束は更新機能との接続がありません –

+0

@AkshayVijayJainもちろんです! 'interval()'によって返される約束は、本体の中のいずれかのコードが例外をスローすると拒否されます。 'update()'呼び出しを含みます。 – Bergi

+0

なぜあなたはinterval()が約束を返すと思いますか? –

0

、私はasycnのは関係がありませんここに感じます/あなたがsetTimeoutで同じ関数を呼び出すのを避けるために使用したばかりです。

それとも、関連性があると言うかもしれない非同期/のawaitが
だから次のリンクは答えるかもしれないあなたがsetTimeoutを
で取得ループを、キャンセルするアユシュで指摘したように、setTimeoutをが何をするかは、しかし、あなたがどんなオプションがありませんやっていますあなたの好奇心。
setTimeout or setInterval?

おかげ

関連する問題