JavaScript setTimeout运行两次

时间:2011-08-22 19:37:42

标签: javascript settimeout

我正在尝试创建一个以精确间隔开始的函数来保持stanble更新速率。问题是它似乎在2个通道中执行。这是日志:

timeElapsed=141; lastDraw=1314040922291
timeElapsed=860; lastDraw=1314040923151
timeElapsed=141; lastDraw=1314040923292
timeElapsed=860; lastDraw=1314040924152
timeElapsed=141; lastDraw=1314040924293
timeElapsed=860; lastDraw=1314040925153
timeElapsed=141; lastDraw=1314040925294
timeElapsed=860; lastDraw=1314040926154
timeElapsed=141; lastDraw=1314040926295
timeElapsed=859; lastDraw=1314040927154
timeElapsed=143; lastDraw=1314040927297
timeElapsed=858; lastDraw=1314040928155
timeElapsed=143; lastDraw=1314040928298
timeElapsed=858; lastDraw=1314040929156
timeElapsed=142; lastDraw=1314040929298

首先,我使用

执行我的功能
drawTimer = setTimeout(function(){ draw() }, 1);

,功能如下:

var draw = function(){
    if(!running)
        return;

    var miliseconds = getCurrentMiliseconds();
    var timeElapsed = miliseconds - lastDraw;
    lastDraw = miliseconds;

    console.log("timeElapsed=" + timeElapsed + "; lastDraw=" + lastDraw);
    onDrawListener(timeElapsed);

    if(timeElapsed < timeLapse)
        miliseconds = timeLapse - timeElapsed;
    else
        miliseconds = 1;        

    drawTimer = setTimeout(function(){ draw() }, miliseconds);
}

它发生在Chrome和Firefox中。你知道它是由什么造成的吗?并且......如何解决它?

P.S。由于每个人似乎都对运行变量感到困惑,因此它是:它是一个私有父对象成员,指示该机制是否仍在运行或已停止。它由其他函数设置,只是为了确保在调用stop()后该函数不能继续工作。

- 更新 - timeLapse设置为1000(每秒1次),永远不会再次更改。

onDrawListener设置为此函数:

function(timeElapsed){
        canvas.clear();

        moveSnake();

        if(snake.body[0] == food){
            food = getRandomFreePosition();
            ++snake.body.lenght;
        }


        drawBackground();
        drawFood();
        drawSnake();

    }

解释一下:canvas是一种负责回调,关键聆听以及一些功能的引擎。除此之外似乎有点自我解释。除了一些int算法和在画布上绘图之外,它们什么都不做。

- 想出来 - 我明白我应该计算当前功能花费的时间,而不是自上一次开始以来。我的旧方法不是在2个频道中工作,而是在长短 - 长 - 短 - 长 - 延迟

2 个答案:

答案 0 :(得分:2)

首先你没有设置运行bool,当你输入函数时,立即在drawTimer上的clearTimeout上做一个。

clearTimeout(drawTimer);

答案 1 :(得分:0)

在这样的循环中,你应该考虑写:

 if(timeElapsed >= AMOUNT_OF_TIME) 
{   
 // run code 
}