2012-08-14 131 views
0

我有一个while循环一样的部份: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)。

抓到哪里?

回答

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

建议没有第二种方法。