0

我有一个像这样的while循环:

var running_time = 0;
var start_time = new Date();
while( cars.length > 0 )
{
    this.update(null, running_time)
    for(var i in cars )
    {
        var car = cars[i];
        car.delay = 0;
        car.update(start_time, this)
    } 

    for( var i in cars_to_remove )
    {
        var index = cars.indexOf(cars_to_remove[i]);
        if( index > -1 )
        {
            cars.splice(index, 1);
        }
    }
    cars_to_remove.splice(0, cars_to_remove.length);
    running_time++;
}
var end_time = new Date();

我在这里所做的是,我正在模拟汽车运动和交通信号灯的动画。循环运行,直到所有汽车到达目的地。当汽车到达目的地被标记为从汽车阵列中移除(参见第二个循环)。

当我在while循环中用断点调试这个while循环时,running_time变量通常在90左右,但是当我在while循环中没有断点,并在上面示例的最后一行设置断点时,running_time变量的值更多(约 12000)。

问题在哪里?

4

1 回答 1

0

您不会将成品车推向cars_to_remove阵列。(或者它只是从显示的代码中丢失了?)

您是否在更新动画的功能中使用setTimeout/ ?setInterval如果在更新汽车位置时涉及超时,则在调试和等待断点时进行的迭代将少于正常执行。

通常这必须通过以下任一方式完成。

方法1(伪代码)

while(condition){
    calculatePosition();
    updatePosition();
}

function updatePosition(){
    if(condition){
       marktoRemove();
    }else{
       setTimeout(function(){
           updateDisplay();
       }, delay);
       delay += 100; // for e.g.
    }
}

方法2(伪代码)- 无 While 循环

setTimeout(function(){

    calculatePosition();

    if(condition){
       marktoRemove();
    }else{
       updateDisplay();
    }     

}, delay);

推荐第二种方法。

于 2012-08-14T19:00:15.793 回答