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