Javascript 节点范围错误,超过最大调用堆栈大小
我一直在看一些关于堆栈溢出的其他问题,这些问题与类似的问题有关。假设这个问题是由于函数递归造成的,但我不能100%确定这是否是相同的情况——正如您将在下面看到的 这是罪魁祸首函数,在该函数中引发错误: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(
/* 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
由myPlayer
prototype中的函数调用,该函数是city
对象所在的位置。我似乎已经解决了这个问题,在我的播放器
类中添加了一个名为超时
的对象,并将超时存储在它们的城市
对象中。更新了我的代码。问题是您无法调用setTimeout
,因为这会破坏堆栈。请给我们看一个堆栈跟踪。调用什么函数initAndParseResearch
?@Bergi Hi,感谢您的回复initAndParseResearch
由myPlayer
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;
}
}