一尘不染

Lodash反跳不反跳

angularjs

我正在尝试使用Lodash来对一个函数进行去抖动,并且在调用该函数时,它似乎根本没有对其进行去抖动。我的问题似乎与我在SO上其他地方看到的错误不一样(通常是,他们没有调用_.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()通过在输入框中键入内容来运行,如果我很快键入乱码,则控制台会在每次按键时每秒打印多次“发出搜索请求”,这表明它根本没有被消除抖动。

任何想法我在做什么错?


阅读 198

收藏
2020-07-04

共1个答案

一尘不染

_.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(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>
2020-07-04