我正在尝试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()
,如果我很快输入乱码,控制台会在每次按键时打印出“搜索请求”,这样每秒多次 - 表示它没有根本没有被去除。
任何想法我做错了什么?
答案 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;
答案 1 :(得分:2)
试试这个:
s._makeSearchRequest = function() {
console.log("making search request");
}
s.search = _.debounce( s._makeSearchRequest, 1000 );