【问题标题】:How to loop setTimeout() and how to stop the loop如何循环 setTimeout() 以及如何停止循环
【发布时间】:2020-09-10 01:17:31
【问题描述】:

我有一个 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() 但它不起作用。

我可以启动它并相应地运行循环,但我不能让它停止。 提前致谢,

【问题讨论】:

    标签: javascript jquery settimeout


    【解决方案1】:

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

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

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

    这样你就可以了

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

    然后clearInterval(intervalID) 当你想停止它时。

    【讨论】:

    • 感谢您的一些澄清。至于为什么我使用 setTimeout 而不是 setInterval 是因为 setInterval 将运行我正在传递的函数,即使它没有在上一次尝试中完成。 setTimeout 在前一个任务完成之前不会执行。另外,我将 setTimeout 保存到变量中并将其传递给 clearTimeout。就是这里的这一行“timeout_function = setTimeout(function start() {})”,我想这就是你所指出的。
    【解决方案2】:

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

    【讨论】:

    • 你好 Piang。我可以知道让第一个循环以 setInterval() 而不是 setTimeout() 开始有什么区别吗?
    • setInterval 本身就是一个循环,而 setTimeout 只运行一次。
    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2012-05-20
    • 2014-05-30
    相关资源
    最近更新 更多