在组合框中点击几次后调用堆栈大小超出

时间:2015-09-30 15:02:48

标签: javascript wcf recursion dojo callstack

我在使用Dojo和使用ArcGIS Javascript API构建的网站上有一个组合框。由于组合框可以包含数千个条目,我将继续进行分页,一次分派25个条目。

如果客户以非常强制的方式非常快速地点击"更多结果"显示在我的25个条目列表的末尾,他结束了(几次点击后)并出现错误。

  • Chrome显示" RangeError:超出最大调用堆栈大小"。
  • Firefox提供"内部错误:过多的递归"。
  • 我们无法在IE上生成问题。

关闭浏览器或清空缓存无济于事。如果任何用户想要调用新请求,则需要回收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;产生了一些未闭合的连接,最终超过了允许的限制。

0 个答案:

没有答案