Задача

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

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

Решение

См. также