web-dev-qa-db-ja.com

Lodash Debounceはデバウンスしません

Lodashを使用して関数をデバウンス しようとしていますが、関数を呼び出している間は、それをまったくデバウンスしていないようです。私の問題は、他の場所で見たものと同じ間違いではないようです SO またはGoogle(一般的に、__.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()を実行します。非常にすばやく入力すると、コンソールは毎回キーを押すたびに「検索要求を行っています」と出力します。 tはまったくバウンスされていません。

私が間違っていることは何ですか?

22
Sasha

_.debouncecreates渡された関数をデバウンスする関数。 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>
35
JLRishe

これを試して:

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

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

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

2
bvaughn