2016-12-28 98 views
2

我想创建setTimeout,将调用函数,然后函数将再次调用setTimeout但具有不同的区间值。动态setTimeout导致“最大调用堆栈超出”错误

问题是,它似乎陷入了无限循环。

这些都是基本变量:

var interval = 1500; 
var elapsed = 0; 
var totalTimer = 40000; 
var startTime = null; 

这是函数:

function playLights(){ 
     startTime = Date.now(); 
     interval = (totalTimer-elapsed) * 0.026; 
     lights[0].color(0, 91, 68, 3500, 0); 
     lights[1].color(0, 91, 68, 3500, 0); 
     setTimeout(function(){ 
      lights[0].color(0, 100, 100, 3500, 0); 
      lights[1].color(0, 100, 100, 3500, 0); 
     }, 300); 
     elapsed = Date.now() - startTime; 
     if((Date.now() - startTime) < 37000){ 
      setTimeout(playLights(), interval.toFixed()); 
     } 
     console.log("Interval: "+interval+" ,Elapsed: "+elapsed); 
    } 

当动作发生了,我叫playLights();

什么是应该发生的:

1)炸弹在游戏中获得种植,

2)它必须调用playLights(),

3)它必须得到当前的时间,并保存它,

4)必须确定区间,这样以来它的第一个电话 - 它必须是1040毫秒。

5)它必须闪烁的颜色。 (现在不重要)

6)然后它必须根据currentDate - storedDate计算经过了多少时间。

7)然后,它必须检查经过时间大于37000毫秒(37秒),

如果是 - 对自己的setTimeout。

如果没有 - 只是没有。

我不断收到由Node.js的

超过最大调用堆栈难道我犯错的地方,导致其陷入无限循环?

+4

'setTimeout(playLights(),''应该是'setTimeout(playLights,' - 您正在运行该方法并传递其结果,rath呃比将它作为参考传递给'setTimeout'。 – Blorgbeard

+0

@Blorgbeard辉煌,谢谢。这解决了这个问题。 – AleRemote225

回答

2

有在你的代码几次失误,例如
在您的功能设置startTimeDate.now()这是正常的,但是!在下一刻您将elapsed设置为Date.now() - startTime,因此它总是0,因为startTime等于Date.now()。 然后你在if部分的陈述中只是做同样的事情,它总会是真的。 SO基本上没有变化,并导致无限循环等。 您可以在您的主要功能中设置startTime,或通过playLights()函数传递它。 最后,你必须通过startTimesetTimeout()callback功能,你可以做到这一点,像这样:

`setTimeout(function() {playLights(startTime);}, interval.toFixed());` 

所以您的代码会是这个样子:

function playLights(startTime) { 
    interval = (totalTimer-elapsed) * 0.026; 
    lights[0].color(0, 91, 68, 3500, 0); 
    lights[1].color(0, 91, 68, 3500, 0); 
    setTimeout(function() { 
     lights[0].color(0, 100, 100, 3500, 0); 
     lights[1].color(0, 100, 100, 3500, 0); 
    }, 300); 
    elapsed = Date.now() - startTime; 
    if (elapsed < 37000) { 
     setTimeout(function(){playLights(startTime)}, interval.toFixed()); 
    } 
    console.log("Interval: "+interval+" ,Elapsed: "+elapsed); 
} 

你可以这样调用:

playLights(Date.now()); 
相关问题