问题描述
我有一个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);