我有 C# 代码,可以在 SQL 中运行查询并返回大约 2000 行。然后创建一个Treeview控件并添加到我的主页。这几乎是立即完成的,这很好。
var orgId = $('select[name="ctl00$PageContent$FunctionsDropDownList"] option:selected').val();
if (!orgId) {
return false;
}
//calls serverside get data
//This line happens quickly
$('#ctl00_PageContent_HiddenRulesDialogTriggerButton').click();
//This part takes about 10-15 minutes to finally get to the true
var i = setInterval(function () {
if ($('#ctl00_PageContent_treeview').find('table').length > 0)
{
clearInterval(i);
StartDialog();
return false;
}
});
所以大约需要10-15分钟才能到达clearInterval(i)
。当它发生时,i = 978
。不知道为什么要花这么长时间。可能是find()
真的很慢。有人推荐替代方案吗?
EDIT
问题可能是您在没有第二个参数(时间间隔)的情况下调用 setInterval
让我们看看您的代码似乎做了什么。
- 查询后端,拉取构建树视图所需的数据。这件事完成得很快。
- 异步构建树。
- 当树正在构建时,继续使用 find() 检查它是否准备好。
有几个问题。
- 与非 DOM 数据操作相比,所有 DOM 查询都相当慢。所以,是的,find() 并不是最快的函数,因为它从您指定的父对象开始搜索整个 DOM,并返回找到的对象。
- 如果您像您一样仅使用一个参数运行 setInterval:
Code:
var timer_id = setInterval(function() {
...code here...
});
...我认为它每毫秒执行一次。我已经用这段代码对此进行了测试:
var k = 1;
var i = setInterval(function () {
if (k < 100)
{
k += 1;
} else {
clearInterval(i);
window.alert('Finished!');
}
//No second argument
});
……几乎立刻就完成了。
所以我猜它运行得这么慢是因为程序每秒触发数百次昂贵的 DOM 搜索。解决方案是:
- 提供在树构建结束时执行您需要的任何操作的函数,作为异步构建函数的回调。这样您就无需进行检查。
- 尝试为 setInterval 提供一个时间间隔,看看它是否可以通过释放程序来构建树而不是重复检查来解决您的问题:
Code:
var i = setInterval(function () {
if ($('#ctl00_PageContent_treeview').find('table').length > 0)
{
clearInterval(i);
StartDialog();
return false;
}
//Once per second
},1000);
回调将是更好的做法,但提供时间间隔也可能有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)