如何使用 setInterval 和 clearInterval?
Posted
技术标签:
【中文标题】如何使用 setInterval 和 clearInterval?【英文标题】:How to use setInterval and clearInterval? 【发布时间】:2011-08-24 03:00:55 【问题描述】:function doKeyDown(event)
switch (event.keyCode)
case 32:
/* Space bar was pressed */
if (x == 4)
setInterval(drawAll, 20);
else
setInterval(drawAll, 20);
x += dx;
break;
大家好,
我想调用 drawAll()
一次,而不是创建一个 循环 来一次又一次地调用 drawAll
,我应该使用递归方法还是应该使用 clearInterval
?
还请告诉我使用clearInterval
?谢谢:)
【问题讨论】:
【参考方案1】:setInterval
设置了一个循环 计时器。它返回一个句柄,您可以将其传递给clearInterval
以阻止它触发:
var handle = setInterval(drawAll, 20);
// When you want to cancel it:
clearInterval(handle);
handle = 0; // I just do this so I know I've cleared the interval
在浏览器上,句柄保证是一个不等于0
的数字;因此,0
为“未设置计时器”设置了一个方便的标志值。 (其他平台可能会返回其他值;例如,NodeJS 的计时器函数会返回一个对象。)
要安排一个函数只触发一次,请改用setTimeout
。不会一直开火。 (它还返回一个句柄,您可以在它触发之前通过clearTimeout
取消它,如果合适的话。)
setTimeout(drawAll, 20);
【讨论】:
【参考方案2】:clearInterval 是一种选择:
var interval = setInterval(doStuff, 2000); // 2000 ms = start after 2sec
function doStuff()
alert('this is a 2 second warning');
clearInterval(interval);
【讨论】:
永远不要使用带有setInterval
或setTimeout
的字符串。
你的意思是我应该删除 doStuff() 周围的引号?
是的,引号和括号都是。简单地说:setInterval(doStuff);
。将字符串传递给setInterval
是对eval
的隐式调用。最好改为传入函数reference。
嗯,否决票也许是公平的。我展示了一个不正确的示例(尽管它在我的情况下有效,但我正在改变这些)。竖起大拇指! :)【参考方案3】:
旁注 – 如果您想使用单独的函数来设置和清除间隔,则间隔变量必须可供所有人访问,在“相对全局”或“一级”范围内:
var interval = null;
function startStuff(func, time)
interval = setInterval(func, time);
function stopStuff()
clearInterval(interval);
【讨论】:
【参考方案4】:我用电子角度,
在我的例子中,setInterval
返回一个 Nodejs Timer 对象。当我打电话给clearInterval(timerobject)
时,它不起作用。
我必须先获取 id 并调用 clearInterval
clearInterval(timerobject._id)
我为此苦苦挣扎了好几个小时。希望这会有所帮助。
【讨论】:
【参考方案5】:请改用setTimeout(drawAll, 20)
。只执行一次函数。
【讨论】:
非常感谢,但是 setTimeout 正在完成每个点的循环,我使用其他方法并且工作正常,函数 doKeyDown(event) switch (event.keyCode) case 32: /* Space条被按下 */ loop = setInterval(drawAll, 20);如果 (x == 202) x = 400;微调器(); 休息; 这不是问题以上是关于如何使用 setInterval 和 clearInterval?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 setInterval 和 clearInterval?
如何使用 window.setInterval 动态创建 HTMLElement 和更新 innerHTML