RangeError:未知原因超出了最大调用堆栈大小
RangeError: Maximum call stack size exceeded from unknown reason
一个小介绍:我实际上在写这篇文章时解决了这个问题,现在我只想知道,为什么它首先存在:
我试图从mongoDB与猫鼬检索数据。代码工作没有问题99%,由于某种原因,只从特定表中查找数据与特定函数导致"最大调用堆栈大小超过"-错误。
现在我有了jasmine测试,它应该确认datalayerdata -table工作正常,但是当它通过getData.js检索数据时,它抛出了错误。
按堆栈顺序排列的代码。
gameddata -spec.js (jasmine spec):
getData.getDataLayer(dataToFind)
.then(function(data) {
console.log("DATA getDataLayer", data[0]);
})
.catch(function(e) {
console.log("Error in finding dataLayerData", e.stack);
});
getData.js(获取数据的代理/API功能):
ret.getDataLayer = function getData(data) {
console.log(666)
return getData(dataLayerData.getDataByPlayer, {gameID: data.gameID, playerID: data.playerID, turnID: data.turnID});
};
function getData (DBfunc, data) {
var promise = DBfunc(data);
return promise;
}
gameData.js(从mongoDB检索数据):
dataLayerData: (function dataLayerData () {Var ret = {};
ret.insert = function (data) {
return insertData( models.dataLayerData, data);
};
ret.getDataByPlayer = function (data) {
var ObjectId = require('mongoose').Types.ObjectId;
return getData( models.dataLayerData, { gameID: ObjectId(String(data.gameID)), playerID: data.playerID, turnID: data.turnID } );
};
return ret;
})()
对于其他表,我甚至不需要mon . schema . types。objectid规范,当找到数据时,但我尝试过这个,虽然没有任何效果(基本上我需要它时手动从命令行做mongoDB,所以我想我也需要它在这里)。
还有mongoDB Schema:
var dataLayerData = new mong.Schema({
"playerID": Number,
"gameID": mong.Schema.Types.ObjectId,
"turnID": Number,
"objects": [
{
"dataName": String,
"dataType": String,
"objects": {
}
}
]
});
现在,如前所述,还有其他表以完全相同的方式被检索并且它们工作。即使我替换了gameData-spec.js。调用其他一些数据库查找,它工作没有问题。我不明白为什么它会进入回调循环,以及如何进入回调循环。
为了调试和清除问题,我将console.log(666)设置为getData.js,它会在一段时间内继续向控制台发送垃圾信息。因此,由于某种原因,这个函数似乎被反复调用。
后来我注意到getData调用是不必要的(这是一个简化的版本)。为什么中间的调用会导致最大调用堆栈错误?
问题是getDataLayer
中的getData
不是下面定义的getData
函数,实际上是上面调用的getData
函数,用于递归。在JavaScript中,递归会导致溢出。
// fixed ---v---
ret.getDataLayer = function(data) {
console.log(666)
return getData(dataLayerData.getDataByPlayer, {gameID: data.gameID, playerID: data.playerID, turnID: data.turnID});
};
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 超过了async.detect最大调用堆栈大小
- 如何远程检查JavaScript应用程序的函数调用堆栈
- 超过了最大调用堆栈大小,循环无限
- 超过了最大调用堆栈大小.递归标签
- 日志:未捕获的范围错误:超过了最大调用堆栈大小
- 未捕获的范围错误:setTimeout()超过了最大调用堆栈大小
- JavaFX+WebView/Javascript:setTimeOut不起作用调用堆栈来自Java
- JavaScript继承:未捕获的范围错误:超过了最大调用堆栈大小
- 使用$cookies和$stateChangeStart检查sessionID是否超过了最大调用堆栈
- jQuery捕获"RangeError:超过了最大调用堆栈大小“;
- 设置这个.RangeError:超过了最大调用堆栈大小
- 收到“范围错误: 超出最大调用堆栈大小”错误
- 递归 - 测试最大堆栈大小时,调用堆栈无法弹出
- 轮询 ajax 函数超出调用堆栈
- Chrome RangeError:使用jQuery$.map时超过了最大调用堆栈大小
- 要求JS 2.1.9引起“;最大调用堆栈"使用Grunt时出错
- Chrome/jQuery未捕获范围错误:超过了最大调用堆栈大小(函数循环)
- 超过了最大调用堆栈大小-没有明显的递归
- 警告:字体加载过程中出错:轨道上的PDFJS超过了最大调用堆栈大小错误