2016-09-22 14 views
0

ws.sendが以下のコードの例外をスローすると、再帰的に送信を停止し、クライアントスレッドが終了するようにします。再帰的なsetTimeoutパターンで例外を処理する方法

function newAlarm(ws) 
{ 
    ws.send(alarm); 
} 

function loop(f,t) 
{ 
    setTimeout(() => loop(f,t), t); 
    f(); 
} 

loop(() => newAlarm(ws),10000); 

私はws.sendのエラーをキャッチすることを理解し、私は次のようにします。ws.send(alarm, err => {if(!err){...}})しかし、私はsetTimeoutをするためにこれを行う方法を見つけ出すことはできません。

答えて

2

タイマーを保持する変数を追加してから、タイマーを停止したいときにクリアしてください。

function newAlarm(ws) 
{ 
     ws.send(alarm); 
} 

function loop(f,t) 
{ 
    var timer = setTimeout(() => loop(f,t), t); 
    try{ 
     f(); 
    } 
    catch{ 
     clearTimeout(timer); 
    } 
} 

loop(() => newAlarm(ws),10000); 
+0

しかし、newAlarmはもはや純粋な関数ではありません。 – Baz

+0

ループ内で 'f()'の周りにtry-catchを置いて、catch内で 'clearTimeout(timer)'を呼び出せますか?私は試したおもちゃの例のために働いた。私は私の答えでコードを更新しました。 – SilentLupin

+0

これは機能し、私はあなたの最初の答えに、それを好む! – Baz

関連する問題