我正在尝试使用Lodash来对一个函数进行去抖动,并且在调用该函数时,它似乎根本没有对其进行去抖动。我的问题似乎与我在SO上其他地方看到的错误不一样(通常是,他们没有调用_.debounce返回的函数)。
_.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()通过在输入框中键入内容来运行,如果我很快键入乱码,则控制台会在每次按键时每秒打印多次“发出搜索请求”,这表明它根本没有被消除抖动。
s.search()
任何想法我在做什么错?
_.debounce 创建 一个函数,以对传递给它的函数进行去抖动。您的s.search函数正在做的事情是_.debounce每次s.search都被再次调用。每次都会创建一个全新的功能,因此没有任何反跳现象。
s.search
因此,解决方案是删除箭头和多余的一对括号,并确保s._makeSearchRequest在访问之前定义了该箭头:
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>