停止JavaScript中的setInterval调用

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

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

1281831 次浏览

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

var refreshIntervalId = setInterval(fname, 10000);
/* later */clearInterval(refreshIntervalId);

请参阅#0#1的文档。

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

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

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

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);});

我希望这有帮助,这是正确的。

为什么不使用更简单的方法?添加一个类!

只需添加一个类,告诉间隔不要做任何事情。例如:on hover。

var i = 0;this.setInterval(function() {if(!$('#counter').hasClass('pauseInterval')) { //only run if it hasn't got this class 'pauseInterval'console.log('Counting...');$('#counter').html(i++); //just for explaining and showing} else {console.log('Stopped counting');}}, 500);
/* In this example, I'm adding a class on mouseover and remove it again on mouseleave. You can of course do pretty much whatever you like */$('#counter').hover(function() { //mouse enter$(this).addClass('pauseInterval');},function() { //mouse leave$(this).removeClass('pauseInterval');});
/* Other example */$('#pauseInterval').click(function() {$('#counter').toggleClass('pauseInterval');});
body {background-color: #eee;font-family: Calibri, Arial, sans-serif;}#counter {width: 50%;background: #ddd;border: 2px solid #009afd;border-radius: 5px;padding: 5px;text-align: center;transition: .3s;margin: 0 auto;}#counter.pauseInterval {border-color: red;}
<!-- you'll need jQuery for this. If you really want a vanilla version, ask --><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<p id="counter">&nbsp;</p><button id="pauseInterval">Pause</button></p>

我一直在寻找这种快速和简单的方法,所以我发布了几个版本,以介绍尽可能多的人。

但是,如果您需要一个功能齐全,可重复使用的计时器,它还支持不同时间间隔的多个任务,您可以使用我的任务计时器(用于节点和浏览器)。

// 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 tasktickInterval: 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 runconsole.log(task.name + ' task has run ' + task.currentRuns + ' times.');// stop the timer anytime you likeif (someCondition()) timer.stop();// or simply remove this task if you have othersif (someCondition()) timer.remove(task.id);}});
// Start the timertimer.start();

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

这里更多

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

你可以使用这个这个关键字来清除Interval,下面是一个例子:

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

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