2016-09-22 66 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

你可以在你的循環中放一個try-catch到'f()'並在catch中調用'clearTimeout(timer)'?它適用於我嘗試過的玩具例子。我在我的答案中更新了代碼。 – SilentLupin

+0

這個作品,我更喜歡你的第一個答案,謝謝! – Baz