Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在组合框中单击几次后超出调用堆栈大小_Javascript_Wcf_Recursion_Dojo_Callstack - Fatal编程技术网

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

Javascript 在组合框中单击几次后超出调用堆栈大小,javascript,wcf,recursion,dojo,callstack,Javascript,Wcf,Recursion,Dojo,Callstack,我在用Dojo和ArcGIS Javascript API构建的网站上有一个组合框。由于组合框可以包含数千个条目,因此我将继续分页,一次分派25个条目 如果客户在我的25个条目列表末尾显示的“更多结果”上以一种非常强迫的方式快速点击,那么他最终(在点击几十次后)会出现一个错误 Chrome显示“RangeError:超出最大调用堆栈大小” Firefox给出了“内部错误:递归太多” 我们无法在IE上生成问题 关闭浏览器或清空缓存没有帮助。如果任何用户想要调用新请求,则需要回收IIS WCF服

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

如果客户在我的25个条目列表末尾显示的“更多结果”上以一种非常强迫的方式快速点击,那么他最终(在点击几十次后)会出现一个错误

  • Chrome显示“RangeError:超出最大调用堆栈大小”
  • Firefox给出了“内部错误:递归太多”
  • 我们无法在IE上生成问题
关闭浏览器或清空缓存没有帮助。如果任何用户想要调用新请求,则需要回收IIS WCF服务应用程序池

combobox数据存储在小部件中创建为:

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!");
},