我正在尝试创建将调用函数的 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);
}
当 Action 发生时,我调用 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
部分的语句中做同样的事情,它将始终为真。
所以基本上没有任何变化,这会导致无限循环等。
您可以在主函数中设置 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());
关于javascript - 动态setTimeout导致 "maximum call stack exceeded"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41354357/