Javascript 节点范围错误,超过最大调用堆栈大小

Javascript 节点范围错误,超过最大调用堆栈大小,javascript,node.js,Javascript,Node.js,我一直在看一些关于堆栈溢出的其他问题,这些问题与类似的问题有关。假设这个问题是由于函数递归造成的,但我不能100%确定这是否是相同的情况——正如您将在下面看到的 这是罪魁祸首函数,在该函数中引发错误: /* inits AND parses research projects from database */ Game.prototype.initAndParseResearch = function(city, research){ var research = JSON.parse(

我一直在看一些关于堆栈溢出的其他问题,这些问题与类似的问题有关。假设这个问题是由于函数递归造成的,但我不能100%确定这是否是相同的情况——正如您将在下面看到的

这是罪魁祸首函数,在该函数中引发错误:

/* inits AND parses research projects from database */
Game.prototype.initAndParseResearch = function(city, research){
    var research = JSON.parse(research);
    var d = new Date().getTime();

    //object that contains active research projects
    var projects = research.active;

    //loop through each active project and "init" the research
    for(var project in projects){
        var obj = this.GameCfg.research_projects[project];
        var timeUntil = (projects[project].started + (obj.time * 60 * 1000)) - d;

        //minimum 0 - don't want a negative time for setTimeout()
        if(timeUntil < 0){
            timeUntil = 0;
        }

        //start timeout
        var timeout = setTimeout(function(){
            console.log('YOU FAILED.');
            //this.researchFinished(city, project);
        }.bind(this), 5000);


        city.research = research;
        city.research.active[project] = {
            timeout : timeout
        };
    }
}
现在,罪魁祸首似乎是当函数试图存储从
setTimeout
返回的句柄时。为什么我不能存储超时引用?我可以存储它并使一切顺利进行,但是如果我需要运行
clearTimeout
,我就不会有任何对timeout对象的引用

更新代码

/* inits AND parses research projects from database */
Game.prototype.initAndParseResearch = function(Player, city, research){
    var research = JSON.parse(research);
    var d = new Date().getTime();

    //object that contains active research projects
    var projects = research.active;

    //loop through each active project and "init" the research
    for(var project in projects){
        var obj = this.GameCfg.research_projects[project];
        var timeUntil = (projects[project].started + (obj.time * 60 * 1000)) - d;

        //minimum 0 - don't want a negative time for setTimeout()
        if(timeUntil < 0){
            timeUntil = 0;
        }

        city.research = research;

        //start timeout
        var timeout = setTimeout(function(){
            this.researchFinished(Player, city, project);
        }.bind(this), timeUntil);

        Player.timeouts['research_'+project] = timeout;
    }
}
/*从数据库初始化和解析研究项目*/
Game.prototype.initAndParseResearch=函数(玩家、城市、研究){
var research=JSON.parse(research);
var d=新日期().getTime();
//包含活动研究项目的对象
var项目=research.active;
//通过每个活动项目循环并“初始化”研究
for(项目中的var项目){
var obj=this.GameCfg.research_projects[project];
var timetill=(projects[project].started+(obj.time*60*1000))-d;
//最小值0-不希望setTimeout()的时间为负
如果(直到<0的时间){
timeUntil=0;
}
城市研究=研究;
//启动超时
var timeout=setTimeout(函数(){
此.researchFinished(玩家、城市、项目);
}.绑定(此),时间直至);
Player.timeouts['research_u'+project]=超时;
}
}

问题在于不能调用
setTimeout
,因为这会破坏堆栈。请给我们看一个堆栈跟踪。调用什么函数
initAndParseResearch
?@Bergi Hi,感谢您的回复
initAndParseResearch
由my
Player
prototype中的函数调用,该函数是
city
对象所在的位置。我似乎已经解决了这个问题,在我的
播放器
类中添加了一个名为
超时
的对象,并将超时存储在它们的
城市
对象中。更新了我的代码。问题是您无法调用
setTimeout
,因为这会破坏堆栈。请给我们看一个堆栈跟踪。调用什么函数
initAndParseResearch
?@Bergi Hi,感谢您的回复
initAndParseResearch
由my
Player
prototype中的函数调用,该函数是
city
对象所在的位置。我似乎已经解决了这个问题,在我的
播放器
类中添加了一个名为
超时
的对象,并将超时存储在它们的
城市
对象中。更新了我的代码。
/* inits AND parses research projects from database */
Game.prototype.initAndParseResearch = function(Player, city, research){
    var research = JSON.parse(research);
    var d = new Date().getTime();

    //object that contains active research projects
    var projects = research.active;

    //loop through each active project and "init" the research
    for(var project in projects){
        var obj = this.GameCfg.research_projects[project];
        var timeUntil = (projects[project].started + (obj.time * 60 * 1000)) - d;

        //minimum 0 - don't want a negative time for setTimeout()
        if(timeUntil < 0){
            timeUntil = 0;
        }

        city.research = research;

        //start timeout
        var timeout = setTimeout(function(){
            this.researchFinished(Player, city, project);
        }.bind(this), timeUntil);

        Player.timeouts['research_'+project] = timeout;
    }
}