Устранение штормов событий с помощью устранения дребезга в JavaScript
12 января 2023 г.В моей предыдущей статье я говорил о дросселирование
. На этот раз мы рассмотрим функцию debounce
и чем она отличается от регулирования
.< /p>
Как использовать отказ
При использовании debounce
функция будет выполняться только по прошествии определенного времени с момента последнего вызова функции. Задержка начинается снова с каждым новым вызовом.
Например, если для события onscroll
установить откат со временем 100 мс, функция будет выполняться через 100 мс после остановки прокрутки.
Другой пример использования debounce
— отправка запросов AJAX на сервер. Допустим, на сайте есть поле поиска и вам нужно отправлять запросы после того, как пользователь введет запрос, и при этом ограничить отправку запросов для каждого нажатого символа.
В этом случае вы можете использовать debounce
и установить временной интервал, через который будет выполняться запрос. Например, установив 1000 мс, запрос произойдет только после того, как скорость нажатия превысит 1 секунду.
Схематически это можно отобразить следующим образом:
Просто для сравнения я продублирую схему throttling
из предыдущей статьи а>:
Многие библиотеки JavaScript, такие как lodash, underscore и rxjs, предоставляют debounce
и throttle
. методы с различными дополнительными функциями. Ниже вы можете просмотреть реализацию метода debounce
:
const debounce = function debounce(fn, time) {
let timeout = null;
return function () {
const context = this;
const args = arguments;
const later = () => {
fn.call(context, ...args);
clearTimeout(timeout);
timeout = null;
}
clearTimeout(timeout)
timeout = setTimeout(later, time);
}
}
Debounce
— это функция более высокого порядка, которая принимает 2 аргумента: основную функцию и таймер. Вы можете узнать больше о функциях высшего порядка в нашей серии статей о функциональном программировании.
Каждый вызов функции обновляет таймер. Когда таймер истекает, функция выполняется. Например, давайте напишем простой обработчик события изменения размера окна, как мы делали это в статье throttling
:
const handleResize = () => {
const { innerHeigh, innerWidth } = window;
console.log({ innerHeigh, innerWidth });
}
window.addEventListener('resize', handleResize)
Давайте завернем обработчик в функцию debounce, а затем убедимся, что функция вызывается только один раз:
const handleResize = () => {
const { innerHeigh, innerWidth } = window;
console.log({ innerHeigh, innerWidth });
}
const handleResizeDebounced = debounce(handleResize, 500);
window.addEventListener('resize', handleResizeDebounced);
Приведенный выше пример практически не имеет смысла. Главное — понять логику, и что назначение функций debounce
и throttle
— снизить нагрузку на браузер за счет уменьшения количества вызовов. р>
Случаи использования для устранения отказов
Общие варианты использования debounce
следующие:
Изменение размера окна браузера. Предположим, что при изменении размера окна браузера некоторые динамические элементы перерисовываются, что во многих случаях приводит к сложным вычислениям, поэтому здесь мы можем воспользоваться преимуществами throttle code> и
отменить дребезг
.
Оптимизация debounce
будет более важной, так как вызов функции будет иметь место только тогда, когда пользователь завершит изменение размера окна браузера; в то время как с throttle
переданная функция сработает в процессе изменения размера по истечении заданного времени ожидания.
Уменьшение количества запросов AJAX. Например, при вводе запроса в поле поиска используйте функцию debounce
в соответствующем обработчике событий с задержкой 200 миллисекунд.
Таким образом, запрос не будет отправляться на сервер после ввода каждой буквы, а будет отправлен один раз после того, как пользователь перестанет вводить запрос и только через 200 миллисекунд.
Выбор функции зависит от задачи
- Если вам нужно, чтобы функция выполнялась с определенной частотой во время любого действия (изменение размера, прокрутка, нажатие клавиши), используйте
throttle
2. Если вам нужно вызвать функцию в конце какого-то действия, лучше использовать debounce
3. Если в начале действия требуется вызов функции, то используем debounce
с дополнительным параметром немедленного вызова
Заключение
В этой статье описывается, как работают функции throttle
и debounce
и как их использовать.
Сначала вы можете не до конца понять логику функций throttle
и debounce
, но использование этих функций во время разработки будет огромным преимуществом, так как это снижает нагрузку на в браузере и, следовательно, на устройстве пользователя.
Оригинал