2016-09-22 2 views
0

Wenn ws.send eine Ausnahme für den folgenden Code auslöst, möchte ich sicherstellen, dass ich rekursiv abhöre und der Client-Thread endet.So behandeln Sie eine Ausnahme im rekursiven setTimeout-Muster

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

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

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

Ich verstehe, dass für ws.send den Fehler zu fangen, ich folgendes tun: ws.send(alarm, err => {if(!err){...}}) Aber ich kann nicht herausfinden, wie dies für setTimeout zu tun.

Antwort

2

Versuchen Sie, eine Variable hinzuzufügen, um Ihren Timer zu halten, und löschen Sie sie dann, wenn Sie möchten, dass sie stoppt.

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

Aber newAlarm ist keine reine Funktion mehr. – Baz

+0

Kannst du einen try-catch um 'f()' in deine Schleife setzen und 'clearTimeout (timer)' im Catch aufrufen? Es funktionierte für ein Spielzeugbeispiel, das ich versuchte. Ich habe den Code in meiner Antwort aktualisiert. – SilentLupin

+0

Das funktioniert und ich bevorzuge es zu Ihrer ersten Antwort, danke! – Baz

Verwandte Themen