【问题标题】:Lodash Debounce not debouncingLodash Debounce 不去抖动
【发布时间】:2015-05-21 19:09:29
【问题描述】:

我正在尝试debounce a function using Lodash,虽然它正在调用该函数,但它似乎根本没有去抖动它。我的问题似乎与我在其他地方看到的 on SO 或 Google 的错误不同(通常,他们没有调用 _.debounce 返回的函数)。

我目前的超简单实现如下(在 Angular 和 CoffeeScript 中):

  s.search = -> _.debounce( s._makeSearchRequest, 1000 )()

  s._makeSearchRequest = -> console.log("making search request")

在 JS 中,我认为是:

  s.search = function() { _.debounce( s._makeSearchRequest, 1000 )() }

  s._makeSearchRequest = function() { console.log("making search request") }

我通过在输入框中输入来运行s.search(),如果我很快输入胡言乱语,控制台会在每次按键时打印出“发出搜索请求”,每秒多次 - 表明它没有被完全消除了。

任何想法我做错了什么?

【问题讨论】:

标签: javascript angularjs coffeescript underscore.js lodash


【解决方案1】:

_.debounce 创建一个函数,该函数对传递给它的函数进行去抖动。你的s.search 函数正在做的是每次调用s.search 时再次调用_.debounce。这每次都会创建一个全新的函数,所以没有什么可以去抖动。

因此解决方案是删除箭头和多余的一对括号,并确保在访问之前定义了s._makeSearchRequest

s._makeSearchRequest = -> console.log("making search request")

s.search = _.debounce( s._makeSearchRequest, 1000 )

示例(使用 JavaScript):

var s;

s = {};

s._makeSearchRequest = function(q) {
  return console.log("making search request: " + q);
};

s.search = _.debounce(s._makeSearchRequest, 1000);

// call s.search three times in a row
s.search(1);
s.search(2);
s.search(3);

// call s.search after 500 ms
setTimeout(s.search, 500, 4);

// call s.search after 3 seconds
setTimeout(s.search, 3000, 5);

// timer to show passage of time
var i = 0;
var t = setInterval(function () {
    i += 1;
    console.log(i + " seconds elapsed");
    if (i > 5) { clearInterval(t); }
}, 1000);
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js"></script>

【讨论】:

  • 我在这里很困惑,我读到 debounce 会忽略在计时器运行期间对其进行的调用,当计时器到期时,它会使用最后一个函数调用参数调用函数,对吗?如果那是正确的,那么上面的去抖动是不正确的,它正在调用所有的函数调用。 @JLRishe 你能帮忙吗?
  • @orangespark 它没有调用所有的函数调用。如果查看代码和日志输出,s.search 在代码中被调用了五次,但只执行了两次。我刚刚向makeSearchRequest 添加了一个参数以更清楚地说明这一点。
【解决方案2】:

试试这个:

s._makeSearchRequest = function() {
    console.log("making search request");
}

s.search = _.debounce( s._makeSearchRequest, 1000 );

POC:http://jsfiddle.net/bvaughn/3saj6znk/

【讨论】:

    猜你喜欢
    • 2017-04-25
    • 2021-11-27
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2021-07-16
    • 2016-07-17
    • 2020-01-23
    • 2017-07-08
    相关资源
    最近更新 更多