在JavaScript中停止setInterval调用

cnu*_*cnu 1332 javascript setinterval

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

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

Joh*_*kin 2058

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

var refreshIntervalId = setInterval(fname, 10000);

/* later */
clearInterval(refreshIntervalId);
Run Code Online (Sandbox Code Playgroud)

请参阅文档for setInterval()clearInterval().

  • 用'clearInterval()'停止后如何再次启动它?如果我尝试重新启动它,我会运行setInterval的2倍. (36认同)
  • 确保你真的停止它.由于变量作用域,您可能没有正确的Id来调用`clearInterval`.我使用了`window.refreshIntervalId`而不是局部变量,它运行得很好! (28认同)
  • SetInterval()不会更改传递它的速度.如果每次调用SetInterval()时它正在加速,那么你有多个同时运行的定时器,并且应该打开一个新问题. (14认同)
  • 我也是每次我想使用SetInterval(MyFunction,4000); 它变得越来越快,每次快2倍:(我怎么能重启一个setinterval? (6认同)
  • 我已经开始将 setInterval 句柄附加到其关联元素(如果相关):`$('foo').data('interval', setInterval(fn, 100));` 然后用 `clearInterval($(' foo').data('interval'));` 我确信也有一种非 jQuery 的方式来做到这一点。 (2认同)

Qui*_*son 102

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

var myTimer = setInterval(...);
clearInterval(myTimer);
Run Code Online (Sandbox Code Playgroud)

  • 我看不出这和约翰的回答有什么区别 (2认同)

小智 46

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

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);
});
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助,这是对的.

  • 其实我认为它不起作用.由于计数器的限制,代码停止执行,但是间隔持续触发varName().尝试在clearInterval()之后记录任何内容(在else子句中),你将看到它永远被写入. (29认同)
  • @OMGrant,除了一个不起作用的例子,你有一个名为`varName`的变量,它存储一个未命名的函数 - w ?? ?? 你应该改变或取消这个答案,恕我直言. (4认同)
  • 我很惊讶地发现它的工作原理是`clearInterval(varName);`.我希望`clearInterval`在传递函数名时不起作用,我认为它需要间隔ID.我想这只有在你有一个命名函数时才能工作,因为你不能将一个匿名函数作为一个变量传递给它自己. (3认同)
  • 如此之多的事情都无法通过,有时我听不懂SO:P (3认同)
  • `$(document).ready(function(){});`是jQuery,这就是为什么它不起作用.至少应该提到这一点. (2认同)

Sch*_*ien 13

上面的答案已经解释了setInterval如何返回句柄,以及如何使用此句柄取消Interval计时器.

一些架构考虑:

请不要使用"无范围"变量.最安全的方法是使用DOM对象的属性.最简单的地方是"文件".如果通过启动/停止按钮启动刷新,则可以使用按钮本身:

<a onclick="start(this);">Start</a>

<script>
function start(d){
    if (d.interval){
        clearInterval(d.interval);
        d.innerHTML='Start';
    } else {
        d.interval=setInterval(function(){
          //refresh here
        },10000);
        d.innerHTML='Stop';
    }
}
</script>
Run Code Online (Sandbox Code Playgroud)

由于函数是在按钮单击处理程序中定义的,因此您不必再次定义它.如果再次单击该按钮,则可以恢复计时器.

  • 你不需要DOM.只是我们一个IIFE,以避免全球范围的污染. (2认同)

dan*_*yag 11

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

您可以使用 this关键字来清除间隔,下面是一个示例:

setInterval(
    function clear() {
            clearInterval(this) 
       return clear;
    }()
, 1000)
Run Code Online (Sandbox Code Playgroud)

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

  • 请记住,clearInterval(this) 在箭头函数中不起作用。 (5认同)

Onu*_*rım 10

已经回答了......但如果您需要一个功能强大,可重复使用的计时器,它还支持不同时间间隔的多个任务,您可以使用我的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();
Run Code Online (Sandbox Code Playgroud)

在您的情况下,当用户点击干扰数据刷新时; 您也可以拨打timer.pause()那么timer.resume(),如果他们需要重新启用.

在这里查看更多.


Sks*_*din 9

clearInterval() 方法可用于清除使用 setInterval() 方法设置的计时器。

setInterval 总是返回一个 ID 值。可以在 clearInterval() 中传递此值以停止计时器。下面是一个计时器从 30 开始并在变为 0 时停止的示例。

  let time = 30;
  const timeValue = setInterval((interval) => {
  time = this.time - 1;
  if (time <= 0) {
    clearInterval(timeValue);
  }
}, 1000);
Run Code Online (Sandbox Code Playgroud)


und*_*low 8

伎俩

setInterval返回一个数字:

在此输入图像描述

解决方案

拿这个号码。将它传递给函数clearInterval,你就安全了:

在此输入图像描述

代码:

始终将返回的数字存储setInterval在变量中,以便稍后可以停止间隔:

const intervalID = setInterval(f, 1000);

// Some code

clearInterval(intervalID);
Run Code Online (Sandbox Code Playgroud)

(将此号码视为 的 ID setInterval。即使您已经呼叫了许多setInterval,您仍然可以通过使用正确的 ID 来阻止其中任何一个。)


Kin*_*der 5

@cnu,

你可以停止间隔,当试试运行代码之前看看你的控制台浏览器(F12)...尝试注释clearInterval(触发器)再看一个控制台,而不是美化?:P

检查示例来源:

var trigger = setInterval(function() { 
  if (document.getElementById('sandroalvares') != null) {
    document.write('<div id="sandroalvares" style="background: yellow; width:200px;">SandroAlvares</div>');
    clearInterval(trigger);
    console.log('Success');
  } else {
    console.log('Trigger!!');
  }
}, 1000);
Run Code Online (Sandbox Code Playgroud)
<div id="sandroalvares" style="background: gold; width:200px;">Author</div>
Run Code Online (Sandbox Code Playgroud)