Lodash Debounce не отлаживает

Я пытаюсь отменить функцию с помощью Lodash, и, хотя она вызывает функцию, она, похоже, не отрицает ее вообще. Моя проблема не похожа на ту, что я видел в других местах на SO или Google (обычно они не _.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(), набирая в поле ввода, и если я набираю тарабарщину очень быстро, консоль выдает "выполнение поискового запроса" при каждом нажатии клавиши, так много раз в секунду, указывая, что это не было дебютировать на всех.

Есть идеи, что я делаю не так?

Ответ 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>

Ответ 2

Попробуйте следующее:

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

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

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