【问题标题】:Using Underscore _.debounce() to trigger a single event使用下划线 _.debounce() 触发单个事件
【发布时间】:2015-07-26 17:19:12
【问题描述】:

我在输入文本字段上从 keyPress 侦听器调用以下函数。 _.debounce() 工作正常,除了在时间段之后仅触发函数 1 次,它触发的次数与 keyPress 事件发生的次数一样多。

console.log("Pre Debounce");
var debounced = _.debounce(function() {
    console.log("Field updated!");
}, 2000);

debounced();

有没有办法将 _.debounce 函数限制为仅在时间段后触发 1 次?

【问题讨论】:

    标签: javascript backbone.js underscore.js


    【解决方案1】:

    您可能每次都在事件内部构造去抖动函数。如果这是您的情况,那么将您的 debounce 函数放在事件响应代码之外。据我所知,去抖函数应该只生成一次,然后被多次调用。

    另一件可能会变得奇怪的事情是,当您进行异步调用(例如,使用 ajax 自动完成)并且它花费的时间超过了您的去抖等待时间,然后请求可能会在稍后触发,从而看起来去抖不起作用。

    【讨论】:

      【解决方案2】:

      您的 debounce 函数的执行时间可能比用户输入的时间长。在这种情况下,您要确保通过将第三个参数(立即)作为 true 传递来防止双重去抖动。

      去抖函数签名为:_.debounce(function, wait, [immediate])

      所以把代码改成:

      console.log("Pre Debounce");
      var debounced = _.debounce(function() {
          console.log("Field updated!");
      }, 2000, true);
      
      debounced();
      

      【讨论】:

      • 我已经尝试过了,它会导致 debouce 无法正常工作并在每次 keyPress 触发时触发。我不确定为什么会这样,但这就是为什么我没有将“立即”选项设置为 true。
      • 如果在您为第三个参数传入 true 时它没有每次都触发,那么问题肯定是您的去抖动回调所花费的时间比用户输入下一个字符所花费的时间要长。你介意分享回调的作用吗?也许我们可以帮助加快速度。
      猜你喜欢
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 2019-12-01
      相关资源
      最近更新 更多