【问题标题】:How to use _.debounce correctly?如何正确使用_.debounce?
【发布时间】:2018-05-13 09:03:36
【问题描述】:

背景

假设您有一个应用程序,当您提出请求时会收到大量信息。在我关于餐馆的应用中,我想在每次收到包含几家餐馆的请求时计算所有菜单的平均价格:

var avg = menus => {
  const sum = menus.reduce( ( sum, currMenu ) => currMenu.price + sum , 0);
  console.log( sum / menus.length );
};

我们的解决方案

问题是我的应用程序开始滞后了这么多餐馆!解决方案?好吧,由于用户不关心每 0.001 毫秒更新一次的平均值,我们决定使用 debounce 来显示每 100 毫秒左右的更新平均值:

var debounceAvg = _.debounce( avg, 100 );

有关 debounce 工作原理的文章,请在此处阅读:

问题

所以,现在我们有了一个去抖动功能。为了测试它,我有一个测试功能:

var myMenus = [ { price: 1 }, { price: 2 }, { price: 3 } ];

var timer = setInterval( params => {
    console.log("executing timer");
    debounceAvg(params);
}, 20, myMenus );

setTimeout( () => { clearInterval(timer) }, 5000);

此函数应每 100 毫秒将所有菜单的平均价格打印到日志中,即使它每 20 毫秒调用一次。但是,我最终只得到 2 个包含平均价格的日志——第一个和最后一个。

问题

我做错了什么?

【问题讨论】:

  • 您要求函数在等待期的前沿触发,因此它总是会在调用后立即触发。
  • 循环不是测试去抖动的最佳方法。整个事情瞬间执行。
  • @Pointy 第一个调用将立即执行。第二个必须等待 100 毫秒。
  • @ibrahimmahrir 这就是为什么我有一个非常非常大的数字。但结果永远不会改变....
  • @Flame_Phoenix 不,据我所知,这不是它的工作原理。 编辑好吧,也许你是对的,但我认为斯宾克斯先生的回答是真实的故事。

标签: javascript underscore.js lodash debouncing


【解决方案1】:

您实际上是在 debounce 函数之外登录。因此,您的日志记录每次都在循环中发生。这就是为什么你得到所有这些零。 您可以在 debounce 函数中进行日志记录(您可以将其作为参数传入),或者检查循环中的更改。

这是将函数作为参数传递给测试的可能实现。我不确定我是否完全理解你在函数中的逻辑,但这至少应该让你开始:

var val = 0;
avg = function(menus, callback) {
  val = menus.reduce( ( sum, currMenu) => currMenu.price + sum , 0)) / menus.length;
  callback();
  return val;
}
var testDebounce = iterations => {
    const myMenus = [];
    for( let i = 0; i < iterations; i++ ) {
        myMenus.push( { price: i } );
        debounceAvg(aparts, function() {
          console.log(val);
        });
    }
};

【讨论】:

  • 您能详细说明一下吗?我很困惑,可以举个例子。
  • @Flame_Phoenix for(10000 iterations) { console.log(something); } 看到了吗?
  • 你能告诉我你的 debounceAvg 函数是什么吗?我很难让你的例子发挥作用。
  • @Flame_Phoenix 他的意思是你的函数的去抖动版本是否真的运行你的 real 函数,它仍然是同步返回的。您的循环在每次迭代时调用 console.log()
  • @Flame_Phoenix,检查我更新的答案。您的debounceAvg 应该保持不变。另外,我为这个测试设置了val global。
猜你喜欢
  • 1970-01-01
  • 2017-12-24
  • 2021-11-06
  • 2020-07-18
  • 2023-02-24
  • 2020-11-07
  • 1970-01-01
  • 2017-02-28
  • 2019-01-27
相关资源
最近更新 更多