Сделать функцию, которая возвращает 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 шт):
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) ); // мс за год.