Debounce — это метод оптимизации, позволяющий ограничить количество вызовов функции при частых событиях, таких как ввод текста, ресайз окна или скролл. Вместо того чтобы вызывать функцию каждый раз при срабатывании события, debounce обеспечивает вызов только один раз за определённый интервал времени после последнего события. Это особенно важно при работе с запросами к API или обновлением сложного интерфейса.
Механизм debounce строится вокруг таймера:
Пример базового debounce на Jav * aScript:
function debounce(fn, delay) {
let timeout;
return function (...args) {
clearTimeout(timeout);
timeout = setTimeout(() => {
fn.apply(this, args);
}, delay);
};
}
В Svelte использование debounce часто требуется для компонентов
ввода, особенно при автозаполнении или поисковых полях. Carbon
Components Svelte предоставляет компоненты типа TextInput,
Search, ComboBox, которые активно используют
события ввода.
Пример с TextInput:
<script>
import { TextInput } from "carbon-components-svelte";
import { onMount } from "svelte";
let query = "";
let results = [];
function fetchResults(value) {
// имитация API запроса
results = [`Результат для "${value}"`];
}
const debouncedFetch = debounce(fetchResults, 500);
</script>
<TextInput
bind:value={query}
placeholder="Введите запрос"
on:input={(e) => debouncedFetch(e.target.value)}
/>
<ul>
{#each results as result}
<li>{result}</li>
{/each}
</ul>
В этом примере каждое изменение текста запускает
debouncedFetch, который выполняет запрос только после 500
мс бездействия.
Использование debounce снижает нагрузку на API и предотвращает лишние рендеры компонентов. Для сложных сценариев можно комбинировать debounce с throttle, чтобы ограничивать частоту вызовов как минимум и максимум, что полезно при динамических интерфейсах.
Debounce отлично сочетается с асинхронными запросами, но важно учитывать состояние компонентов. Если компонент может быть уничтожен до завершения запроса, необходимо отменять обработку результата, чтобы избежать ошибок:
async function fetchResultsAsync(value) {
const controller = new AbortController();
const signal = controller.signal;
try {
const response = await fetch(`https://api.example.com/search?q=${value}`, { signal });
const data = await response.json();
results = data.items;
} catch (err) {
if (err.name !== "AbortError") {
console.error(err);
}
}
return controller;
}
let activeController;
function debouncedFetchAsync(value) {
if (activeController) activeController.abort();
activeController = fetchResultsAsync(value);
}
Carbon Components Svelte поддерживает различные события и двустороннюю привязку данных. Debounce особенно полезен с компонентами:
$:) для автоматического обновления
интерфейса.В Svelte можно использовать реактивные выражения для упрощения вызова функций с debounce:
<script>
import { TextInput } from "carbon-components-svelte";
let query = "";
let results = [];
const debouncedUpdate = debounce((value) => {
results = [`Результат для "${value}"`];
}, 400);
$: debouncedUpdate(query);
</script>
<TextInput bind:value={query} placeholder="Поиск..." />
<ul>
{#each results as result}
<li>{result}</li>
{/each}
</ul>
Такой подход позволяет сократить обработчики событий и сохраняет чистоту кода, полностью используя реактивность Svelte.
Эффективное применение debounce с Carbon Components Svelte позволяет создавать быстрые, отзывчивые интерфейсы с минимальной нагрузкой на клиентскую и серверную часть, обеспечивая комфортный пользовательский опыт при работе с динамическими данными.