Как можно реализовать функцию debounce для поля ввода, чтобы минимизировать количество вызовов API в JavaScript?

Я работаю над функцией поиска, которая позволяет пользователю вводить текст в поле и вызывает API для получения подсказок. В данный момент API вызывается при каждом нажатии клавиши, что является неэффективным подходом. Я хочу внедрить механизм debounce, чтобы API вызывался только после того, как пользователь перестанет вводить текст в течение определенного времени. <br/><br/> Можете ли вы объяснить, как реализовать debounce в JavaScript? Вот текущий код, который я использую: <br/><br/><pre><code>const input = document.getElementById("search");

input.addEventListener("input", (e) =&gt; {
    fetchSuggestions(e.target.value); // Этот вызов происходит при каждом нажатии клавиши
});

function fetchSuggestions(query) {
    console.log("Fetching suggestions for:", query);
    // Симуляция вызова API
}</code></pre> <br/><br/> Как мне изменить этот код, чтобы встроить механизм debounce для функции fetchSuggestions?
  • 8 декабря 2024 г. 14:03
Ответы на вопрос 3
Чтобы внедрить механизм debounce в вашу функцию поиска, вы можете создать универсальную функцию debounce, которая будет управлять задержкой вызова вашей функции `fetchSuggestions`. Этот подход поможет минимизировать количество вызовов API, предоставляя пользователю возможность вводить текст, прежде чем выполняется запрос.

Вот пример того, как можно реализовать debounce в вашем коде:

```javascript
const input = document.getElementById("search");

// Функция debounce
function debounce(func, delay) {
    let timeoutId;
    return function(...args) {
        // Очищаем таймер, если debounce вызывается повторно
        if (timeoutId) {
            clearTimeout(timeoutId);
        }
        // Устанавливаем новый таймер
        timeoutId = setTimeout(() => {
            func.apply(this, args);
        }, delay);
    };
}

// Обернем вашу функцию fetchSuggestions в debounce
const debouncedFetchSuggestions = debounce(fetchSuggestions, 300); // 300 мс задержка

input.addEventListener("input", (e) => {
    debouncedFetchSuggestions(e.target.value); // Теперь вызов идет через debounce
});

function fetchSuggestions(query) {
    console.log("Fetching suggestions for:", query);
    // Здесь вы можете добавить реальный вызов API
}
```

### Пояснение кода:

1. **Функция debounce**:
   - Эта функция принимает в качестве аргументов другую функцию (`func`) и задержку (`delay`), которая указывает, сколько миллисекунд необходимо подождать перед вызовом `func`.
   - Она возвращает новую функцию, которая будет вызвана при каждом событии. Внутри этой функции сначала очищается таймер с помощью `clearTimeout()`, а затем устанавливается новый таймер с помощью `setTimeout()`. Это гарантирует, что функция `func` будет вызвана только после того, как прошло `delay` миллисекунд после последнего вызова.

2. **Использование debounce**:
   - Мы оборачиваем вашу функцию `fetchSuggestions` в `debounce`, указывая задержку в 300 миллисекунд. Это значит, что API будет вызываться только после того, как пользователь перестанет вводить текст в поле ввода на 300 миллисекунд.

Теперь ваш код будет эффективнее использовать API, вызывая его только тогда, когда пользователь заканчивает вводить текст, а не при каждом нажатии клавиши.
Отключать и ставить таймер на выполнение каждый вызов <br/> <pre><code class="javascript">const input = document.getElementById("search");
let searchdDebounceTimerHandler;

input.addEventListener("input", (e) =&gt; {
    clearTimeout(searchdDebounceTimerHandler); // Если ввод быстрый, удаляем выполнение функции каждый раз
    searchdDebounceTimerHandler = setTimeout(() =&gt; {
        fetchSuggestions(e.target.value);
    }, 1000); // Сработает через секунду от последнего нажатия
});</code></pre>
<pre><code class="javascript">function debounce(func, delay) {
    let timeoutId;
    return function (...args) {
        clearTimeout(timeoutId);
        timeoutId = setTimeout(() =&gt; {
            func.apply(this, args);
        }, delay);
    };
}

input.addEventListener('input', debounce(e =&gt; {
    fetchSuggestions(e.target.value); // This is being called on every keystroke
}, 100));</code></pre>
Похожие вопросы