如何使用 setInterval 和 clearInterval?

IT技术 javascript jquery
2021-02-01 15:07:35
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谢谢 :)

5个回答

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

clearInterval是一种选择:

var interval = setInterval(doStuff, 2000); // 2000 ms = start after 2sec 
function doStuff() {
  alert('this is a 2 second warning');
  clearInterval(interval);
}
嗯,否决票也许是公平的.. 我展示了一个不正确的例子(虽然它适用于我的情况,但我正在改变这些)。竖起大拇指!:)
2021-03-14 15:07:35
切勿使用带有setInterval或 的字符串setTimeout
2021-03-26 15:07:35
是的,引号和括号都是。简单地说:setInterval(doStuff);将字符串传入setInterval是对 的隐式调用eval最好传入函数引用
2021-03-27 15:07:35
你的意思是我应该删除围绕 doStuff() 的引号?
2021-04-07 15:07:35

使用setTimeout(drawAll, 20)来代替。那只执行一次函数。

非常感谢,但是 setTimeout 在每个点都完成了循环,我使用其他方法并且它工作正常,函数 doKeyDown(event) { switch (event.keyCode) { case 32: /* Space bar was press */ loop = setInterval (drawAll, 20); 如果 (x == 202) { x = 400; 微调器();} 休息; } }
2021-04-04 15:07:35
这不是问题
2021-04-07 15:07:35

我用角度和电子,

就我而言,setInterval返回一个 Nodejs Timer 对象。当我调用clearInterval(timerobject)它不起作用。

我必须先获取 id 并调用 clearInterval

clearInterval(timerobject._id)

我为此苦苦挣扎了好几个小时。希望这可以帮助。

旁注 - 如果您想使用单独的函数来设置和清除间隔,则必须在“相对全局”或“上一级”范围内对所有这些函数都可以访问间隔变量:

var interval = null;    

function startStuff(func, time) {
    interval = setInterval(func, time);
}

function stopStuff() {
    clearInterval(interval);
}