繁体   English   中英

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

[英]How to loop setTimeout() and how to stop the loop

我有一个 setTimeout() 循环,它工作得很好,只是我不知道如何在需要时停止它。

我已经阅读了一些类似查询的帖子,但由于某种原因,我无法使这些解决方案适合我的情况,希望有人能帮助我。

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

好的,所以这个想法是,当我运行 testFunction() 并且它包含动作“开始”时,setTimeout() 循环将开始,当我再次运行 testFunction() 但动作“停止”或其他任何事情时,它应该通过运行 clearTimeout() 来打破循环,但事实并非如此。

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

我可以启动它,循环会相应地运行,但我无法让它停止。 提前致谢,

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

因此,在第 6 行,当您再次调用setTimeout时,您并没有保存它在任何地方返回的 id,因此您无法清除它,因此无论您是否清除了第 3 行的setTimeout函数,它都会执行。

现在的问题是:您可以尝试使用超时来做什么,但我认为使用类似的函数setInterval会容易得多。 它的工作方式与 timeout 完全相同,但它会在一个时间间隔内无限期地执行传递给它的函数,直到它被清除为止。

这样你就可以

const intervalID = setInterval (() => {
                    primaryTestFunction(param1, param2, param3);
                   }, 10000);
                  

然后在您想停止它时clearInterval(intervalID)

 var loop1 = setInterval(()=> { if(action == 'start'){ primaryTestFunction(param1, param2, param3); setTimeout(start, 10000); } else{ clearInterval(loop1); } },100);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM