Задача
Написать декоратор для функции, который ограничивает число вызовов.
callLimit(fn, limit, callback) принимает следующие аргументы:
fn— функция, которую декорируем;limit— максимальное число вызовов;callback— вызывается, когда совершён последний вызов (опционально).
У вызываемой функции должен быть метод для перезагрузки счётчика в начальное положение.
Пример
function log(title, message) {
console.log(title + ' : ' + message);
}
var logLimited = callLimit(log, 3);
logLimited('title', 'desc'); // title: desc
logLimited('title2', 'desc'); // title2: desc
logLimited('title3', 'desc'); // title3: desc
logLimited('title4', 'desc'); // Этот не сработает
logLimited.reset(); // Перезагрузили счётчик
logLimited('title5', 'desc'); // title5: desc
logLimited('title6', 'desc'); // title6: desc
logLimited('title7', 'desc'); // title7: desc
var logLimited2 = callLimit(log, 2, () => console.log('finish'));
logLimited2('foo', 'bar'); // foo: bar
logLimited2('foo2', 'bar'); // foo2: bar
// finishРешение
Оптимальное решение
function callLimit(fn, limit, callback) { let counter = 0; const obj = function (...args) { if (counter >= limit) return; fn.call(this, ...args); counter++; if (counter >= limit && callback !== undefined) { callback(); } }; obj.reset = () => (counter = 0); return obj; }