Запланированный вызов функций или «вызови меня не чаще, чем»

Если синхронность функции не имеет значения (в нашем случае она будет вызывана черз минимальный таймаут), то можно провести следующий трюк. Вместо вызова функции, мы планируем ее вызов в будущем через setTimeout и запоминаем наши намерения. При последующих вызовах этой функции в пределах одного блока, мы видим, что вызов запланирован, и спокойно ничего не делаем. В общем виде получается нижеследующее:
function planned (func, delay) {
	var was_planned,
		timer;

	was_planned = false;
	return function () {
		if (!was_planned) {
			timer = setTimeout(function () {
				func();
				was_planned = false;
			}, delay || 0);
		}
		was_planned = true;
		return timer;
	};
}


И да, чтобы можно было отменить вызов запланированной функции, всегда возвращаем id интервала.
Если использовать 0 интервал, то функцию можно использовать для разовой отправки данных при выходе из блока кода, а с 100мс — перерасчет размеров блоков при ресайзе окна.

function recalculate_box_sizes () {
	// stuff to make design fit window size
}
recalculate_box_sizes = planned(recalculate_box_sizes, 300);
window.onresize = recalculate_box_sizes;
Share
Send
Popular