Javascript 在组合框中单击几次后超出调用堆栈大小
我在用Dojo和ArcGIS Javascript API构建的网站上有一个组合框。由于组合框可以包含数千个条目,因此我将继续分页,一次分派25个条目 如果客户在我的25个条目列表末尾显示的“更多结果”上以一种非常强迫的方式快速点击,那么他最终(在点击几十次后)会出现一个错误Javascript 在组合框中单击几次后超出调用堆栈大小,javascript,wcf,recursion,dojo,callstack,Javascript,Wcf,Recursion,Dojo,Callstack,我在用Dojo和ArcGIS Javascript API构建的网站上有一个组合框。由于组合框可以包含数千个条目,因此我将继续分页,一次分派25个条目 如果客户在我的25个条目列表末尾显示的“更多结果”上以一种非常强迫的方式快速点击,那么他最终(在点击几十次后)会出现一个错误 Chrome显示“RangeError:超出最大调用堆栈大小” Firefox给出了“内部错误:递归太多” 我们无法在IE上生成问题 关闭浏览器或清空缓存没有帮助。如果任何用户想要调用新请求,则需要回收IIS WCF服
- Chrome显示“RangeError:超出最大调用堆栈大小”
- Firefox给出了“内部错误:递归太多”李>
- 我们无法在IE上生成问题
var cboValueDataStore = new com.<...>.data.IdsValuesQueryReadStore(
{
url: "proxy.ashx",
requestMethod: "get",
doClientPaging: false,
url2: getValuesUrl
}
);
IdsValuesQueryReadStore类包含这两个函数,用户每次单击“更多结果”时都会调用这两个函数:
及
我已经查看了代码中的递归错误,例如函数调用本身,但是我找不到任何东西
我在启动bug时监控了资源,CPU、网络、磁盘或内存上都没有额外的费用
我真的不知道现在到哪里去解决这个问题。我读过这个案子
事件将在“上一个”和“下一个”按钮之间递归传播,并且不知道picklist分页是否会出现这种情况。。。但如果是这样,我不知道如何解决这个问题
有线索吗
编辑#1(2015-10-01):
我为请求添加了一些计数器。每次用户点击“更多结果”,就会调用函数fetch和_filterresponse;因此,它们应该具有相同的计数。console.log显示_filterResponse比fetch慢一些。我有点像
...
fetchCount = 220
fetchCount = 221
fetchCount = 222
filterResponseCount = 98
fetchCount = 223
filterResponseCount = 99
...
我想知道在IIS中更改一些参数(如队列长度)是否有帮助
编辑#2(2015-10-01):
我试图通过以下方式降低fetch函数的速度:
fetch: function(request) {
console.log("IdsValuesQueryReadStore : fetch");
this.fetchCount++;
console.log("fetchCount = ", this.fetchCount);
this.sleep(1000);
...
},
sleep: function(miliseconds) {
console.log("Go to sleep");
var currentTime = new Date().getTime();
while (currentTime + miliseconds >= new Date().getTime()) {
}
console.log("Wake up!");
},
通过减慢fetch函数的速度,我发现fetchCount和filterResponse的计数更接近,但在大约100次单击后,代码最终崩溃了
编辑#3(2015-10-06):
看来我们找到了答案。问题出在我们的WCF代码中:一些数据库连接没有正确关闭。每次点击“更多结果”都会产生一些未关闭的连接,并最终超过允许的限制
_filterResponse: function(data) {
console.log("IdsValuesQueryReadStore : _filterResponse");
data = json.parse(data);
data.items = this._dataToItems(data[0]);
data.numRows = data[1];
return data;
},
...
fetchCount = 220
fetchCount = 221
fetchCount = 222
filterResponseCount = 98
fetchCount = 223
filterResponseCount = 99
...
fetch: function(request) {
console.log("IdsValuesQueryReadStore : fetch");
this.fetchCount++;
console.log("fetchCount = ", this.fetchCount);
this.sleep(1000);
...
},
sleep: function(miliseconds) {
console.log("Go to sleep");
var currentTime = new Date().getTime();
while (currentTime + miliseconds >= new Date().getTime()) {
}
console.log("Wake up!");
},