evgeniy8705
@evgeniy8705
Повелитель вселенной

Не могу понять решение задачи на JS (таймеры)?

Еще один вопрос про задачу. Прошу объяснить.
Задача:
Напишите функцию debounce(f, ms), которая возвращает обёртку, которая передаёт вызов f не чаще, чем раз в ms миллисекунд.

«Лишние» вызовы игнорируются. Все аргументы и контекст — передаются.

Решение:
function debounce(f, ms) {

	var state = null;

	var COOLDOWN = 1;

	return function() {
		if (state) return;

		f.apply(this, arguments);

		state = COOLDOWN;

		setTimeout(function() { state = null }, ms);
	}

}


/* Тест должен выводить 14 */
function test() {
	var log = '';
	function f(a) { log += a; }

	f = debounce(f, 1000);

	f(1);
	f(2);

	setTimeout(function() { f(3) }, 100); 
	setTimeout(function() { f(4) }, 1100); 
	setTimeout(function() { f(5) }, 1500);

	setTimeout(function() { alert(log) }, 2000); // 14

}

test();


Не могу понять это решение. Распишите пожалуйста что да как.
PS Особенно непонятно про возвращаемую внутреннюю функцию и про "log"
  • Вопрос задан
  • 2541 просмотр
Пригласить эксперта
Ответы на вопрос 3
@asdz
имеется ввиду что ваш debounce не позволяет вызвать функцию чаще определенной величины, т.е. если слишком часто вызывается функция, "лишние" вызовы игнорируются. принцип заключается в том что устанавливается значение переменной state с нужной частотой, если вызов функции слишком частый, то отбрасываемые вызовы будут попадать на тот момент когда эта переменная =1 и вызов функции не будет выполнятся - if (state) return;
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Знаете, просмотрев ваши предыдущие вопросы... Распишите сами, построчно. Любое предположение. Пометьте непонятные вопросы. Иначе это будет не продуктивно (как я смотрю).

Особенно непонятно про возвращаемую внутреннюю функцию и про "log"

Читаем про замыкания и каррирование
Ответ написан
Комментировать
Keyten
@Keyten
Я бы реализовал как-то так:
function debounce(f, ms){
 var lastCall = 0, now;
 return function(){
  now = Date.now();
  if(now > lastCall + ms){
   lastCall = now;
   f.apply(this, arguments);
  }
 };
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы