Подряд возникает несколько событий с одинаковым типом
Нет необходимости в получении результата обработки промежуточных событий
Обработка занимает длительное время
Пользователь изменяет количество товара в корзине интернет-магазина
Как мы видим, пересчет корзины происходит не при каждом изменении количества товара, а только после прекращения кликов.
Пересчет происходит на сервере, поэтому нет смысла тратить серверные ресурсы на промежуточные пересчеты, которые устареют за время выполнения XHR-запросов.
Если бы пересчет был моментальный, то пользователь наблюдал бы мельтешащие цифры.
По-прежнему необходимо получать каждое событие, но обрабатывать только то, после которого в течение некоторого времени не произошло новых событий.
Для реализации пригодятся таймеры.
При возникновении события можно устанавливать таймер, который будет вызывать итоговый обработчик.
document.addEventListener('click', () => { console.log('clicked') })
let timer = null document.addEventListener('click', () => { if(timer) window.clearTimeout(timer) timer = window.setTimeout(() => { console.log('clicked') }, 1000) })
function debounce(func, time) {
let iTimeout = null
return (...args) => {
if(iTimeout) {
window.clearTimeout(iTimeout)
}
iTimeout = window.setTimeout(() => {
func(...args)
iTimeout = null
}, time)
}
}
const onClickDebounced = debounce(() => { console.log('clicked') }, 1000) document.addEventListener('click', onClickDebounced)
Хорошая реализация функции debounce включена в библиотеку Lodash