如何循环setTimeout以及如何停止循环

问题描述

我有一个setTimeout()循环,可以正常工作,只是我不知道如何在需要它时停止它。

我已经阅读了几篇类似的帖子,但是由于某些原因,我无法使这些解决方案适合我的情况,希望有人可以帮助我。

var timeout_function;
function testFunction(param1,param2,param3,action){
    timeout_function = setTimeout(function start() {
        if(action == 'start'){
            primaryTestFunction(param1,param3);
            setTimeout(start,10000);
        }else{
            clearTimeout(timeout_function);
        }
    },10000);
}

好吧,所以这个想法是,当我运行testFunction()并包含动作“ start”时,setTimeout()循环将开始,而当我再次运行testFunction()但动作为“ stop”或该动作时,它将开始无关紧要,它应该通过运行clearTimeout()来打破循环,但事实并非如此。

我什至在timeout_function之外和if()语句中放置了另一个clearTimeout()来捕获停止操作并运行clearTimeout(),但是它不起作用。

我可以启动它,并相应地运行循环,但是我不能使其停止。 预先感谢,

解决方法

首先,如果这引起混乱,setTimeout不会返回函数,而是返回整数id。当您将该ID传递给clearTimeout时,它将不会执行传递给setTimeout的回调函数。但是clearTimeout只会清除与传递给它的ID相关联的功能,不会清除可能同时处于活动状态的任何其他计时器。

因此,在第6行,当您再次调用setTimeout时,您并没有保存它返回到任何地方的ID,因此您无法清除它,因此无论您是否清除{ {1}}函数在第3行。

现在要提出的问题是:您可能尝试使用超时来进行处理,但是我认为使用类似的功能setTimeout会容易得多。它的工作原理与超时完全相同,但是它会无限期地执行传递给它的函数,直到清除为止。

这样您就可以

setInterval

然后要停止它时再const intervalID = setInterval (() => { primaryTestFunction(param1,param2,param3); },10000);

,

    var loop1 = setInterval(()=> {

 if(action == 'start'){
            primaryTestFunction(param1,param3);
            setTimeout(start,10000);
        }

else{
            clearInterval(loop1);
        }

    },100);