Сделать функцию, которая возвращает null при её повторном вызове

Всем привет! Есть функция, которая принимает в себя функцию и время (мс) и возвращает эту же функцию. При вызове функция отрабатывает как надо, но следующий вызов, пока не пройдёт время которое мы передали 2 аргументом, получает всегда null

Вызов колбэка я передаю в сетТаймаут в качестве дополнительных аргументов и возвращается результат какой-то. Но вот вопрос, как вернуть null при повторном вызове? ?

const func = (callback, ms) => {
  let timeStr = String(ms);
  let timeS = +timeStr.slice(0, -3);

  setTimeout(
    (timeS) => {
      return console.log(timeS);
    },
    timeS * 1000,
    callback()
  );
};

const callback = () => {
  return "result";
};

const item = func(callback, 3000);

console.log(item); // результат
console.log(item); // null  пока не пройдёт 3 секунды


Ответы (1 шт):

Автор решения: OPTIMUS PRIME

const func = min_delay(3000, function() {
  return 'result';
});

console.log(func()); // 'result'
console.log(func()); // null

/***/
function min_delay(ms, fn) {
  let last_call = new Date() - ms;
  // Где-то нужно запоминать время предыдущего успешного вызова.
  
  // Создаем и возвращаем новую функцию, которая будет управлять вызовом fn.
  return function() {
    let now = new Date();
    let dt = now - last_call;
    
    if (dt < ms) {
      console.log('Ждите еще ' + (ms - dt) + 'мс...');
      return null;
    }
    
    // Прошло больше, чем ms. Можно вызвать оригинальную функцию.
    last_call = now;
    return fn.apply(undefined, arguments); // (*1)
  }
}
<button onclick="console.log(func());">Click-Test...</button>

(*1) fn.apply(undefined, arguments); — переменная arguments внутри функций (не стрелочных) имеет специальное значение: Это нумерованный список аргументов, с которыми была вызвана функция. Т.е. сколько аргументов передадут при вызове созданной функции - столько и передается в оригинальную функцию.

А apply позволяет вызвать функцию, передав ей аргументы в виде списка.
fn(a, b, c) ← эквивалентны → fn.apply(undefined, [a, b, c])
Справка: Function.prototype.apply(контекст, список_аргументов).


* При участии в арифметических операциях, объект Date превращается в количество миллисекунд, прошедших с 1 янв 1970;

console.log( new Date() ); // «Сейчас»
console.log( new Date() - 0 ); // «Сейчас» в миллисекундах с 1970.

// Из одного Date можно вычесть другой.
console.log( new Date(2021, 0) - new Date(2020, 0) ); // мс за год.

→ Ссылка