Функция
debounce
возвращает функцию, которая никогда не вызывается, когда вы вызываете debounce
как
debounce(getData, 2000);
dobounce
, функция не должна возвращать функцию. Вам просто нужно выполнить следующие шаги для реализации функции debounce
:
Проверьте, не определено ли timer
. Если нет, это означает, что существует тайм-аут, который нам нужно отменить.
После этого установите новый таймер, вызвав setTimeout()
, который вызывает данную функцию после указанного c количества времени .
Кроме того, timer
не должно быть локальной переменной, потому что вы не хотите, чтобы она сбрасывалась всякий раз, когда вызывается функция debounce
.
let counter = 0;
let newValue;
let timer;
const getData = () => {
console.log("Fetching Data ..", newValue, counter++);
}
const debounce = function(fn, d) {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(fn, d);
}
const betterFunction = (e) => {
newValue = e.target.value;
debounce(getData, 2000);
}
<input type="text" onkeyup="betterFunction(event)" />
Если вы не хотите объявлять timer
как глобальную переменную и хотите вернуть функцию из функции debounce
, тогда вам нужно вызвать функция debounce
один раз изначально, и всякий раз, когда событие keyup
срабатывает в элементе input
, вы вызываете функцию, возвращенную функцией debounce
, вместо вызова функции debounce
.
let counter = 0;
let newValue;
const getData = () => {
console.log('Fetching Data ..', newValue, counter++);
};
const debounce = function(fn, d) {
let timer;
return function() {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(fn, d);
};
};
const intermediate = debounce(getData, 2000);
const betterFunction = (e) => {
newValue = e.target.value;
intermediate();
};
<input type="text" onkeyup="betterFunction(event)" />