Node.js 如何在递归setTimeout模式中处理异常

Node.js 如何在递归setTimeout模式中处理异常,node.js,Node.js,如果ws.send引发下面代码的异常,我希望确保停止递归发送,并且客户端线程结束 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

如果ws.send引发下面代码的异常,我希望确保停止递归发送,并且客户端线程结束

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执行此操作。

尝试添加一个变量来保存计时器,然后在希望计时器停止时清除它

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);

尝试添加一个变量来保存计时器,然后在希望计时器停止时清除它

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);

但是newAlarm不再是一个纯粹的函数。你能在循环中的
f()
周围放置一个try catch,并在catch中调用
clearTimeout(timer)
吗?我试过一个玩具的例子。我更新了答案中的代码。这很有效,我更喜欢它,而不是你的第一个答案,谢谢!但是newAlarm不再是一个纯粹的函数。你能在循环中的
f()
周围放置一个try catch,并在catch中调用
clearTimeout(timer)
吗?我试过一个玩具的例子。我更新了答案中的代码。这很有效,我更喜欢它,而不是你的第一个答案,谢谢!