javascript - 动态setTimeout导致 "maximum call stack exceeded"错误

标签 javascript node.js

我正在尝试创建将调用函数的 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/

相关文章:

javascript - Google map + Google 本地搜索根据英国邮政编码生成纬度/经度

javascript - 使用 Javascript 进行自动身份验证?

javascript - 如何将高分辨率图像转换为低分辨率图像?

node.js - 如何在同一服务器中使用 Node js重定向到react js应用程序?

javascript - 部署到 Heroku 时异步功能不起作用

javascript - 如何在 Angular JS 中提交表单时获取输入字段的标签

javascript - RadioButtons 行为奇怪 Angular 4

javascript - 多个元素的事件监听器,当存储为变量时

node.js - 使用带有 node.js 的 jquery AJAX,处理来自服务器的响应

使用 MongoDB 的 Node.js Express 路由