Lodash Debounce没有贬值

时间:2015-03-18 19:59:00

标签: javascript angularjs coffeescript underscore.js lodash

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

我目前的超简单实现如下(在Angular with 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(),如果我很快输入乱码,控制台会在每次按键时打印出“搜索请求”,这样每秒多次 - 表示它没有根本没有被去除。

任何想法我做错了什么?

2 个答案:

答案 0 :(得分:28)

_.debounce 创建一个能够去除传递给它的函数的函数。您的s.search函数正在执行的操作是每次调用_.debounce时都会再次调用s.search。这样每次都会产生一个全新的功能,所以没有什么能够去抖动。

所以解决方法是删除箭头和额外的括号,并确保在访问它之前定义了s._makeSearchRequest

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

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

示例(使用JavaScript):



var s;

s = {};

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

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

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

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

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

// 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>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

试试这个:

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

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

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