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はまったくバウンスされていません。
私が間違っていることは何ですか?
_.debounce
creates渡された関数をデバウンスする関数。 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>
これを試して:
s._makeSearchRequest = function() {
console.log("making search request");
}
s.search = _.debounce( s._makeSearchRequest, 1000 );