动态setTimeout导致“最大调用堆栈超出”错误
问题描述:
我想创建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的
超过最大调用堆栈难道我犯错的地方,导致其陷入无限循环?
答
有在你的代码几次失误,例如
在您的功能设置startTime
到Date.now()
这是正常的,但是!在下一刻您将elapsed
设置为Date.now() - startTime
,因此它总是0
,因为startTime
等于Date.now()
。 然后你在if
部分的陈述中只是做同样的事情,它总会是真的。 SO基本上没有变化,并导致无限循环等。 您可以在您的主要功能中设置startTime
,或通过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());
'setTimeout(playLights(),''应该是'setTimeout(playLights,' - 您正在运行该方法并传递其结果,rath呃比将它作为参考传递给'setTimeout'。 – Blorgbeard
@Blorgbeard辉煌,谢谢。这解决了这个问题。 – AleRemote225