ChatGPT解决这个技术问题 Extra ChatGPT

在 JavaScript 中停止 setInterval 调用

我使用 setInterval(fname, 10000); 在 JavaScript 中每 10 秒调用一次函数。是否可以在某些事件上停止调用它?

我希望用户能够停止重复刷新数据。


i
its4zahoor

setInterval() 返回一个间隔 ID,您可以将其传递给 clearInterval()

var refreshIntervalId = setInterval(fname, 10000);

/* later */
clearInterval(refreshIntervalId);

请参阅 setInterval()clearInterval() 的文档。


用“clearInterval()”停止后如何重新启动它?如果我尝试重新启动它,我会运行 2 倍的 setInterval。
我也是每次我想使用 SetInterval(MyFunction , 4000);它变得越来越快,每次快 2 倍 :( 我如何重新启动 setinterval??
SetInterval() 不会改变您通过它的速度。如果每次调用 SetInterval() 时它所做的任何事情都会加快速度,那么您有多个同时运行的计时器,并且应该提出一个新问题。
确保你真的在阻止它。由于范围可变,您可能没有正确的 ID 来调用 clearInterval。我使用 window.refreshIntervalId 而不是局部变量,效果很好!
我已经开始将 setInterval 句柄附加到它的关联元素(相关时):$('foo').data('interval', setInterval(fn, 100));,然后用 clearInterval($('foo').data('interval')); 清除它我确信也有一种非 jQuery 方法可以做到这一点。
H
Hatchet

如果将 setInterval 的返回值设置为变量,则可以使用 clearInterval 停止它。

var myTimer = setInterval(...);
clearInterval(myTimer);

我看不出这和约翰的回答有什么区别
晚了但是,我认为它被复制了一些单词差异,没有比约翰的回答更清楚
B
Blauharley

您可以设置一个新变量,并在每次运行时将其递增 ++(向上计数),然后我使用条件语句来结束它:

var intervalId = null;
var varCounter = 0;
var varName = function(){
     if(varCounter <= 10) {
          varCounter++;
          /* your code goes here */
     } else {
          clearInterval(intervalId);
     }
};

$(document).ready(function(){
     intervalId = setInterval(varName, 10000);
});

我希望它有所帮助,而且它是正确的。


我很惊讶地发现这行得通 clearInterval(varName);。我希望 clearInterval 在传递函数名称时不起作用,我认为它需要间隔 ID。我想这只有在你有一个命名函数时才有效,因为你不能将匿名函数作为变量传递给它自己。
其实我觉得行不通。由于计数器的限制,代码停止执行,但间隔不断触发 varName()。尝试在 clearInterval() 之后(在 else 子句中)记录任何内容,您将看到它被永远写入。
$(document).ready(function(){ }); 是 jQuery,这就是它不起作用的原因。至少应该提到这一点。
@OMGrant,除了一个不起作用的示例之外,您还有一个名为 varName 的变量,它存储一个未命名的函数 - wha??恕我直言,您应该更改或删除此答案。
正如 MSN 非常清楚的那样,clearInterval 需要一个 id 而不是函数:developer.mozilla.org/en-US/docs/Web/API/WindowTimers/…。由于此答案不正确且具有误导性,因此我将其否决。
O
Onur Yıldırım

已经回答...但是如果您需要一个特色的、可重复使用的计时器,它还支持不同时间间隔的多个任务,您可以使用我的 TaskTimer(用于节点和浏览器)。

// Timer with 1000ms (1 second) base interval resolution.
const timer = new TaskTimer(1000);

// Add task(s) based on tick intervals.
timer.add({
    id: 'job1',         // unique id of the task
    tickInterval: 5,    // run every 5 ticks (5 x interval = 5000 ms)
    totalRuns: 10,      // run 10 times only. (omit for unlimited times)
    callback(task) {
        // code to be executed on each run
        console.log(task.name + ' task has run ' + task.currentRuns + ' times.');
        // stop the timer anytime you like
        if (someCondition()) timer.stop();
        // or simply remove this task if you have others
        if (someCondition()) timer.remove(task.id);
    }
});

// Start the timer
timer.start();

在您的情况下,当用户单击干扰数据刷新时;如果他们需要重新启用,您也可以先调用 timer.pause(),然后再调用 timer.resume()

请参阅more here


a
assayag.org

在 nodeJS 中,您可以在 setInterval 函数中使用“this”特殊关键字。

您可以使用此关键字来清除Interval,这是一个示例:

setInterval(
    function clear() {
            clearInterval(this) 
       return clear;
    }()
, 1000)

当您在函数中打印 this 特殊关键字的值时,您会输出一个 Timeout 对象 Timeout {...}


A
Aart den Braber

为什么不使用更简单的方法?加一门课!

只需添加一个告诉间隔不要做任何事情的类。例如:悬停时。

变量 i = 0; this.setInterval(function() { if(!$('#counter').hasClass('pauseInterval')) { //只有在没有这个类时才运行 'pauseInterval' console.log('Counting.. .'); $('#counter').html(i++); //只是为了解释和展示 } else { console.log('停止计数'); } }, 500); /* 在本例中,我在 mouseover 上添加一个类,并在 mouseleave 上再次删除它。你当然可以随心所欲 */ $('#counter').hover(function() { //mouse enter $(this).addClass('pauseInterval'); },function() { //鼠标离开 $(this).removeClass('pauseInterval'); } ); /* 其他示例 */ $('#pauseInterval').click(function() { $('#counter').toggleClass('pauseInterval'); });身体{背景颜色:#eee;字体系列:Calibri、Arial、无衬线字体; } #counter { 宽度:50%;背景:#ddd;边框:2px 实心#009afd;边框半径:5px;填充:5px;文本对齐:居中;过渡:.3s;边距:0 自动; } #counter.pauseInterval { 边框颜色:红色; }

 

多年来,我一直在寻找这种快速简便的方法,因此我发布了几个版本,以向尽可能多的人介绍它。


对我来说似乎并不简单......我也认为删除间隔而不是保持对什么都不做的函数的调用更干净。
我不同意。 this.setInterval(function() { if(!$('#counter').hasClass('pauseInterval')) { //do something } }, 500); 是您所拥有的所有代码。此外,检查是您要做的第一件事,因此在悬停时它非常轻巧。这就是它的用途:暂时暂停功能。如果你想无限期地终止它:当然你删除了间隔。
这相当于轮询,通常不鼓励。它会将 CPU 从低功耗状态唤醒,只是为了进行(可能)无用的检查。在此示例中,它还将反馈从立即延迟到 0 到 500 毫秒之间。
我完全不同意你的观点,即使我在 2 年前编写了代码。无论如何,柜台必须在那里,因为 OP 要求它。当然,如果您在按下按钮后使用它来停止计数器,例如,这将是一个次优的解决方案,但只是在悬停时暂停,这是可用的最简单的解决方案之一。