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以阻止其触发: 0;因此,0为“未设置定时器”设置了一个方便的标志值。 (其他平台可能会返回其他值;例如,NodeJS的计时器函数将返回一个对象。)

要安排一个函数仅触发一次,请改用setTimeout。它不会继续射击。 (它还会返回一个句柄,如果合适的话,可以在一次触发前通过clearTimeout取消它。)

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


#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一起使用。

– T.J.拥挤者
2011年5月12日13:19



您是说我应该删除doStuff()周围的引号?

–约书亚-Pendo
2011年5月12日13:23

是的,双引号和括号。只需:setInterval(doStuff);。将字符串传递给setInterval是对eval的隐式调用。最好改为传递函数引用。

– T.J.拥挤者
2011年5月12日13:28

嗯,不好意思,也许是公平的。我展示了一个不正确的示例(尽管在我的情况下是可行的,但正如我们所说的,我正在更改它们)。竖起大拇指! :)

–约书亚-Pendo
2011年5月12日13:37

#3 楼

请改用setTimeout(drawAll, 20)。那只会执行一次功能。

评论


非常感谢,但是setTimeout在每个点上都完成了循环,我使用了其他方法,并且工作正常,函数doKeyDown(event){switch(event.keyCode){情况32:/ *按下空格键* / loop = setInterval (drawAll,20);如果(x == 202){x = 400; spinner(); }; }}

–拉吉
2011年5月24日10:10



这不是问题

– NinoŠkopac
18年3月15日在6:05

#4 楼

我将角与电子配合使用,对于我来说,setInterval返回一个Nodejs Timer对象。当我打电话给clearInterval(timerobject)时,它不起作用。

我必须先获取ID并致电clearInterval

clearInterval(timerobject._id)

几个小时。希望对您有所帮助。

#5 楼

旁注–如果要使用单独的功能来设置和清除间隔,则必须在“相对全局”或“一级升级”范围内对所有这些变量进行访问:

var interval = null;    

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

function stopStuff() {
    clearInterval(interval);
}