5

我有一个setInterval显示动画的循环。

当我clearInterval响应用户输入时,队列中可能有一个或多个循环回调。如果我在clearInterval语句之后直接调用函数,则函数调用首先完成(将某些内容打印到屏幕上),然后执行排队的循环回调,删除我想要打印的内容。

请参阅下面的代码。

function loop() {
    // print something to screen
}

var timer = setInterval(loop(), 30);

canvas.onkeypress = function (event) {
    clearInterval(timer);
    // print something else to screen
}

处理这个问题的最佳方法是什么?推迟// print something else to screen? 在循环中进行新的打印?

编辑:感谢您的回答。为了将来参考,我的问题是触发额外打印的事件被埋在循环中,所以一旦执行,控制权就交还给未完成的循环,然后覆盖它。干杯。

4

2 回答 2

2

您还可以使用标志来忽略任何排队的功能:

var should;

function loop() {
    if(!should) return; // ignore this loop iteration if said so

    // print something to screen
}

should = true;
var timer = setInterval(loop, 30); // I guess you meant 'loop' without '()'

canvas.onkeypress = function (event) {
    should = false; // announce that loop really should stop
    clearInterval(timer);
    // print something else to screen
}
于 2011-10-01T14:20:38.707 回答
2

首先,您可能的意思是:

var timer = setInterval(loop, 30);

其次,您确定呼叫clearInterval不会清除待处理loop()呼叫的队列吗?如果是这种情况,您可以通过使用某种防护来轻松禁用这些调用:

var done = false;

function loop() {
    if(!done) {
      // print something to screen
    }
}

var timer = setInterval(loop(), 30);

canvas.onkeypress = function (event) {
    clearInterval(timer);
    done = true;
    // print something else to screen
}
于 2011-10-01T14:20:54.503 回答