Асинхронный JavaScriptТаймерыeasy

Debounce

Нам дана функция fn, которая принимает произвольное количество аргументов. Она ничего не возвращает, просто выполняет какое-то асинхронное действие. Например, логирует какие-то события, отправляет запрос на бэкенд или, как в примере ниже, просто выводит в консоль свои аргументы.

Функция debounce принимает функцию fn и время ms, а возвращает новую функцию, которая вызывает fn, но контролирует, чтобы вызовы происходили не слишком часто — не чаще чем раз в ms миллисекунд.

Пример

На картинке ниже изображены вызовы функции с задержкой равной 400 мс.

Верхняя серия прямоугольников — вызовы функции debouncedFn. Один прямоугольник означает 100 мс. Например, первый розовый вызов произошел в момент времени 700 мс.

Нижняя серия прямоугольников показывает, когда реально произошли вызовы исходной функции fn.

Код для запуска

Комментариями помечены вызовы fn, которые фактически произошли. 500, 1700 и 2500 — время в мс, когда они произошли.

function fn(...args) { console.log({ args, time: Date.now() - start, }); } const debouncedFn = debounce(fn, 400); let start = Date.now(); setTimeout(() => debouncedFn(1, "blue"), 0); setTimeout(() => debouncedFn(2, "green"), 100); // 500 setTimeout(() => debouncedFn(3, "pink"), 700); setTimeout(() => debouncedFn(4, "pink"), 1000); setTimeout(() => debouncedFn(5, "pink"), 1300); // 1700 setTimeout(() => debouncedFn(6, "blue"), 1800); setTimeout(() => debouncedFn(7, "green"), 1900); setTimeout(() => debouncedFn(8, "blue"), 2100); // 2500

Требуется подписка

Эта задача доступна при покупке курса или на индивидуальных занятиях.

Подборка задач по асинхронности содержит 35 задач, из которых 21 задача можно тестировать бесплатно.

После покупки курса открывается возможность отправлять все задачи без ограничений по количеству отправок, а также авторские решения и видеоразборы общей длительностью более 10 часов.