Самописный throttle: реализация функции ограничения частоты вызовов

Для leading-only throttle запомните время последнего выполнения. Первый вызов выполняется сразу, обращения до истечения интервала игнорируются, this и аргументы передаются исходной функции.

Короткий ответ

Что ответить на собеседовании

Для leading-only throttle запомните время последнего выполнения. Первый вызов выполняется сразу, обращения до истечения интервала игнорируются, this и аргументы передаются исходной функции.

Подробный разбор

Ответ с пояснениями

Условие

Реализуйте функцию throttle, которая ограничивает количество вызовов переданной функции за заданный промежуток времени. Функция должна принимать два параметра: целевую функцию и интервал в миллисекундах, и возвращать обёртку, вызывающую оригинал не чаще указанного интервала. При попытках вызвать функцию чаще, чем разрешено, лишние вызовы должны либо игнорироваться, либо откладываться до окончания текущего интервала, в зависимости от выбранной стратегии.

(Кодовые блоки сохраняются без изменений.)

Ответ

Для leading-only throttle запомните время последнего выполнения. Первый вызов выполняется сразу, обращения до истечения интервала игнорируются, this и аргументы передаются исходной функции.

function throttle(fn, interval) {
  if (!Number.isFinite(interval) || interval < 0) throw new RangeError('Некорректный интервал');
  let last = -Infinity;
  return function (...args) {
    const now = performance.now();
    if (now - last < interval) return undefined;
    last = now;
    return fn.apply(this, args);
  };
}

Это явно выбранная стратегия без отложенного последнего вызова. performance.now монотонен и не зависит от перевода системных часов. Если функция бросит исключение, интервал всё равно считается начавшимся. Ограничивается частота запусков, а не количество одновременно работающих async-операций.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее