我在使用Dojo和使用ArcGIS Javascript API构建的网站上有一个组合框。由于组合框可以包含数千个条目,我将继续进行分页,一次分派25个条目。
如果客户以非常强制的方式非常快速地点击"更多结果"显示在我的25个条目列表的末尾,他结束了(几次点击后)并出现错误。
关闭浏览器或清空缓存无济于事。如果任何用户想要调用新请求,则需要回收IIS WCF服务应用程序池。
组合框数据存储区在窗口小部件中创建为:
var cboValueDataStore = new com.<...>.data.IdsValuesQueryReadStore(
{
url: "proxy.ashx",
requestMethod: "get",
doClientPaging: false,
url2: getValuesUrl
}
);
IdsValuesQueryReadStore类以
开头require(
["dojo/_base/declare",
"dojox/data/QueryReadStore",
"dojo/_base/lang",
"dojo/json",
"dojo/_base/array"],
function(declare, QueryReadStore, lang, json, array) {
declare(
"com.fujitsu.data.IdsValuesQueryReadStore",
QueryReadStore,
{
IdsValuesQueryReadStore类包含这两个函数,每次用户点击时都会调用这些函数&#34;更多结果&#34; :
fetch: function(request) {
console.log("IdsValuesQueryReadStore : fetch");
var pageNumber = Math.floor(request.start / request.count) + 1;
request.serverQuery = {
url: this.url2 +
request.query.where +
"&start=" +
pageNumber +
"&count=" +
request.count
};
return this.inherited("fetch", arguments);
},
和
_filterResponse: function(data) {
console.log("IdsValuesQueryReadStore : _filterResponse");
data = json.parse(data);
data.items = this._dataToItems(data[0]);
data.numRows = data[1];
return data;
},
我已经查看了递归错误的代码,例如调用自身的函数,但我找不到任何东西。
我在启动错误时监控了资源,并且CPU,网络,磁盘或内存都没有特别费用。
我真的不知道现在要去哪里解决问题。我已经读过这个案子了 http://www.codeproject.com/Tips/765248/Resolve-Too-Much-Recursion-Error-when-Using-Jquery 其中一个事件将在Previous和Next按钮之间递归传播,并想知道这个问题是否与picklist分页的情况一样......但如果是这样,我不知道如何解决这个问题!
任何线索,任何人?
编辑#1(2015-10-01):
我为请求添加了一些计数器。每次用户点击&#34;更多结果&#34;时,都会调用fetch和_filterResponses函数;因此他们应该有相同的数量。 console.log显示_filterResponse在某种程度上比fetch慢。我有类似
的东西...
fetchCount = 220
fetchCount = 221
fetchCount = 222
filterResponseCount = 98
fetchCount = 223
filterResponseCount = 99
...
我想知道更改IIS中的某些参数(如队列长度)是否有帮助?
编辑#2(2015-10-01):
我试图以这种方式减慢获取功能:
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!");
},
通过减慢获取功能,我看到fetchCount和filterResponse计数更接近,但代码在大约100次点击后最终崩溃......
编辑#3(2015-10-06):
我们似乎已经明白了。问题出在我们的WCF代码中:某些数据库连接未正确关闭。每次点击&#34;更多结果&#34;产生了一些未闭合的连接,最终超过了允许的限制。