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超出的最大调用堆栈
我在某个地方犯了什么错误,导致它陷入无限循环?
例如,代码中有几处错误
在你的函数中,你可以设置startTime
为Date.now()
,但是没关系! 在下一个时刻,你设置elapsed
到Date.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());