我使用这个函数按金额顺序追加新项目。此函数每30-50ms调用一次。
var insertBefore = false;
container.find('.roll-user-row[data-user-id="' + user_data.id + '"]').remove();
container.children().each(function () {
var betContainer = $(this), itemAmount = $(this).attr('data-amount'), betId = $(this).attr('data-user-id');
if (itemAmount < betData.totalAmount) {
insertBefore = betContainer;
return false;
}
});
if (insertBefore) {
$(template).insertBefore(container);
} else {
container.prepend(template);
}
itemAmount=$(this).attr('data-amount')
是整数,betData.totalAmount
也是整数。如果附加速度低于±300ms,则一切正常。在快速追加的情况下,我得到以下结果:
这甚至不是我想要的——这是随机的。如何解决这个问题?
我只是在这里发布方法,如果我的理解是正确的,那么我将发布一个代码。读到这里,我首先想到的是“虚拟DOM”的概念。这是你能做的,
>
使用高频率的随机函数调用仅用于维护数据结构(如对象)。不要依赖DOM更新。
然后使用一个频率低得多的setInterval
重复函数调用从该数据结构中重新绘制(或更新)DOM。
我不确定有什么理由不能采用这种方法,但这将是在时间关键型用例中处理DOM最有效的方法。
1.重构
首先,返回
中的
。每个
回调都不起作用。它只是打断了当前的迭代,而不是整个循环。若要中断循环,应使用简单for循环和
break
语句。然后,我建议尽量少打电话给$()
,因为这很昂贵。因此,我建议对您的函数进行以下重构:
function run() {
container.find('.roll-user-row[data-user-id="' + user_data.id + '"]').remove();
var children = container.children();
for (var i = 0; i < children.length; i++) {
var betContainer = $(children[i]); // to cache children[i] wrapping
var itemAmount = betContainer.attr('data-amount');
var betId = betContainer.attr('data-user-id');
if (itemAmount < betData.totalAmount) {
$(template).insertBefore(container);
return; // instead of "break", less code for same logic
}
}
container.prepend(template); // would not be executed in case of insertBefore due to "return"
}
2.节流
要运行50毫秒的重复过程,您需要使用类似于
setInterval(run,50)
的方法。如果您需要确保run
已经完成,并且这是300毫秒的延迟,那么您可以只使用setInterval(run,300)
。但是如果进程以您无法更改的方式初始化,并且50毫秒是固定的时间间隔,那么您可以通过lodash throttle或jquery throttle插件保护run
调用:
var throttledRun = _.throttle(run, 300); // var throttledRun = $.throttle(300, run);
setInterval(throttledRun, 50);
setInterval
只是一个例子,您需要在中继器初始化逻辑中将初始的run
替换为限制版本(throttledRun
)。这意味着自上一次执行run
以来,只有经过300毫秒的间隔,才会执行run
。
问题内容: 在名为News的模型中 在Javascript中,我将AJAX post方法与formdata一起使用。我要设置这个区域。 上面我在JS中编写的代码是这样设置的 和上面的代码我将进入控制器。但是,尽管至少我选择了两个区域,但它始终返回0条记录。 我的Ajax方法在上面。我在哪里犯错? 提前致谢。 问题答案: 如果您用于发送数据,则需要将每个单独的名称/值发送给。由于它是一个集合,因此您
问题内容: 我有一个与数据库对话的servlet,然后返回一个有序(按时间排序)对象的列表。在servlet部分,我有 从日志中,我可以看到数据库以正确的顺序返回了User对象。 在前端,我有 但是顺序改变了。 我只在返回的列表很大(超过130个用户)时才注意到这一点。 我尝试使用Firebug进行调试,Firebug中的“响应选项卡”显示列表的顺序与servlet中的日志不同。 我做错了什么吗?
他,大家!我的测试是由jenkins从通用包运行的。我可以在spock中设置测试包,它将首先运行,如果在这个包中没有通过任何测试,其他测试应该跳过。我看到这样的例子:
问题内容: 我首先遇到以下查询的问题是该子句是在:之前执行的: 该列是由 因此,我尝试了带有子查询和其他bs的各种不同可能的解决方案。最后,我在子句中尝试了一些不同的子查询,女巫要求我将表顺序从子句更改为子句。我决定尝试以下方法: 由于某种原因,这似乎可以正确排序, 但是为什么 呢? 这种变化如何使我的查询比以前更正确地排序? 真的吗 还是只是针对我提出的测试用例而做? 问题答案: 因此,我对以下
我有一个for循环,它遍历CSV中的每一行,我创建了一个包含列表的字典,但是列表被重写了,因为字典键被重复了几次。我如何总结或追加到列表中的第二(1)位置相同的键的下一个值下一个循环迭代? 因为使用append时,如果再次找到现有键,则会覆盖该值,因此该键的值会被一次又一次地覆盖。 CSV中的字段包括: 输出应该是这样的: