Lodash Debounce没有贬值

Sas*_*sha 22 javascript coffeescript underscore.js angularjs lodash

我正试图使用Lodash去抖动函数,虽然它正在调用函数,但它似乎根本没有去抖动它.我的问题似乎与我在其他地方在SO或Google 看到的错误一样(通常,他们没有调用_.debounce返回的函数).

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

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

  s._makeSearchRequest = -> console.log("making search request")
Run Code Online (Sandbox Code Playgroud)

在JS中,我相信:

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

  s._makeSearchRequest = function() { console.log("making search request") }
Run Code Online (Sandbox Code Playgroud)

s.search()通过在输入框中输入来运行,如果我很快输入乱码,控制台会在每次按键时打印出"发出搜索请求",这样每秒多次 - 表示它根本没有被去抖动.

我有什么想法我做错了吗?

JLR*_*she 37

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

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

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

s.search = _.debounce( s._makeSearchRequest, 1000 )
Run Code Online (Sandbox Code Playgroud)

示例(使用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);
Run Code Online (Sandbox Code Playgroud)
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)