当前位置: 首页 > 知识库问答 >
问题:

按放置的数量追加订购的项目

令狐嘉禧
2023-03-14

我使用这个函数按金额顺序追加新项目。此函数每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,则一切正常。在快速追加的情况下,我得到以下结果:

这甚至不是我想要的——这是随机的。如何解决这个问题?

共有2个答案

柯奕
2023-03-14

我只是在这里发布方法,如果我的理解是正确的,那么我将发布一个代码。读到这里,我首先想到的是“虚拟DOM”的概念。这是你能做的,

>

  • 使用高频率的随机函数调用仅用于维护数据结构(如对象)。不要依赖DOM更新。

    然后使用一个频率低得多的setInterval重复函数调用从该数据结构中重新绘制(或更新)DOM。

    我不确定有什么理由不能采用这种方法,但这将是在时间关键型用例中处理DOM最有效的方法。

  • 穆飞星
    2023-03-14

    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中的字段包括: 输出应该是这样的: