dynamicsetTimeout会导致“超出最大调用堆栈”错误

我正在尝试创build将调用函数的setTimeout,然后函数将再次调用setTimeout,但具有不同的区间值。

问题在于它似乎陷入了无限循环。

这些是启动variables:

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

这是function:

 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计算经过了多less时间。

7)然后它必须检查经过时间是否超过37000毫秒(37秒)

如果是 – setTimeout本身。

如果没有 – 只是没有。

我一直得到Node.js超出的最大调用堆栈

我在某个地方犯了什么错误,导致它陷入无限循环?

例如,代码中有几处错误
在你的函数中,你可以设置startTimeDate.now() ,但是没关系! 在下一个时刻,你设置elapsedDate.now() - startTime所以它将始终为0 ,因为startTime等于Date.now() 。 那么你只要在if部分的陈述中做同样的事情,那将永远是真的。 所以基本上没有什么变化,并导致一个无限循环等。您可以设置startTime在您的主要function,或通过playLights()函数传递。 最后,你必须将startTime传递给setTimeout()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());