Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   динамическйи таймер в setInterval ? (https://javascript.ru/forum/misc/40050-dinamicheskjji-tajjmer-v-setinterval.html)

Arramis 22.07.2013 23:55

динамическйи таймер в setInterval ?
 
Здравстуйте господа, меня мучает вопрос: почему нельзя динамически менять таймер в функции setInterval ??? это же переменная по сути, если рассуждать логически то эту переменную в цикле можно изменять, и тогда наш setInterval будет выполнять функцию с динамически меняющимся таймером, тоесть такой код должен алертить каждый раз на одну секунду позже чем в предыдущий раз:
var end = 5000;
				for (var t = 1000; t <= end; t+=1000) {		
				var id = setInterval(test, t);
					function test () {
						var testDiv = document.getElementById("testDiv");
						alert(testDiv.firstChild.nodeValue + t);
						if (t == end) clearInterval(id);
					}
				}

<div id = "testDiv">test</div>

но это теоретически, запустив в консоли, выдаелась ошибка - test is not defined - а это как мне кажется значит что таймер даже не установился в самом начале так ведь ??? тонкости джаваскрипта к сожалению пока не освоил, буду очень признателен за какие - нибудь ссылки где будет какой нибудь пример похожий на этот, или если вам приходилось такое вытворять покажите как , спасибо

danik.js 23.07.2013 03:15

Функции нельзя объявлять в цикле.

danik.js 23.07.2013 03:18

Ты в цикле хочешь запустить несколько таймеров. Но ты не сохраняешь их идентификаторы (сохраняешь только последний). Как ты их собрался останавливать без id?

Arramis 23.07.2013 16:33

danik.js,
что скажешь по поводу такого
var end = 5000;			
			var i = 1;
			for (var t = 1000; t <= end; t += 1000) {				
				i = setInterval(function test() { alert("test" + t); }, t);	
				while (i < end/t) {
					alert("setting up new timer");
					clearInterval(i);
					i++;					
				}					
			}

здесь по идеи во внутреннем цикле while каждый i - ый setInterval должен останавливаться, но происходит тупо выброс из главного цикла for с таймером 6000 (6 секунд) офигеть ! таймер всё таки получлось сбросить но вот зациклить каждое следующее выполнение фукнции test на одну секунду позже - не удалось - какие то магические алерты происходят если запустить этот код =)

danik.js 23.07.2013 16:55

С чего ты взял что id, выдаваемый при вызове функции setInterval будет меньше определенной величины (end/t допустим) ? Браузер может хоть миллион выдать. Это id, его бесполезно сравнивать, бесполезно инкрементировать.

Arramis 23.07.2013 17:32

danik.js
почему бесполезно сравнивать и инкрементировать??? id это же переменная в которой МЫ решаем что будет хранится так ведь?? если да, то её можно изменять и делать всё что угодно, в частности назначить каждому выполнению setInterval свой конкретный id в цикле, тем самым зациклить выполнение

danik.js 23.07.2013 18:13

Можешь записывать в нее угодно. Но чтобы убить таймер, тебе нужно в clearInterval() передать именно id, который вернула функция setInterval. Передашь чета другое (допустим id++) - и тогда либо ты убъешь другой таймер либо ничего не произойдет вовсе.

Arramis 23.07.2013 18:35

danik.js,
так я же сначала убиваю таймер а потом только инкрементирую id,
while (i < end/t) {
                    alert("setting up new timer");
                    clearInterval(i);
                    i++;                   
                }

Arramis 23.07.2013 18:43

danik.js,
Тоесть я сначала убиваю именно тот таймер который был передан в setInterval после увеличиваю id и делаю тоже самое и т.д.

danik.js 24.07.2013 00:35

Повторяю вопрос. С чего ты взял что id меньше определенного числа, допустим end/t ?

Arramis 24.07.2013 02:02

danik.js,
эм, честно говоря я сам незнаю с чего я так решил, сейчас уже понимаю что с этим id я намудрил, ведь это же результат работы функции, тоесть это что - то, что идентифицирует работу нашего setInterval, чтобы потом мы смогли обратиться к нему чтобы остановить, но тогда по твоему сделать чтобы setInterval срабатывал скажем на одну секунду позже каждый следующий раз ?
вот кстати ещё одна тчедная попытка это реализовать
var end = 5000;			
			var i = 1;
			for (var t = 1000; t <= end; t += 1000) {
				alert(i);
				i = setInterval(function test() { alert("test" + t); i++; }, t);	
				alert("setting up new timer");
			}
			for (; i > 0; i--) {
				clearInterval(i);
			}
тут уже кстати говоря id увеличивается, но подозреваю что это не тот id - он просто налету создаёт новую переменную и алерит её а настоящий id видимо не трогает, и ещё кстати тут таймер тоже сбрасывается но setInterval выполняет test с нулевой задержкой ( короче опять магические алерты

Arramis 24.07.2013 02:20

danik.js,
а вобще говоря осуществимо ли это или я зря пытаюсь по твоему? тоесть сделать так чтобы setInterval выполнял функцию каждый раз на одну секунду позже либо раньше...

danik.js 24.07.2013 03:15

Открой для себя setTimeout ))

<script>
function setIncrementalInterval(callback, startInterval, increment) {
	var timeout = startInterval;
	(function fn() {
		setTimeout(function(){
			callback();
			timeout += increment;
			fn();
		}, timeout);
	})();
}

var lastTime;
var fn = function(){
	var now = new Date();
	var interval = now - lastTime;
	document.body.innerHTML += interval + '<br />';
	lastTime = now;
};

lastTime = new Date();
setIncrementalInterval(fn, 1000, 100);

</script>

Arramis 24.07.2013 18:27

danik.js,
хаха, нуда я вобщем то думал использовать setTimeout с рекурсией,
просто хотелось понять тонкости этого setInterval' а - чего не вышло (
кстати мой код с рекурсией и setTimeout
function dynamicAlert (timer, increment, end) {
	if (timer <= end) {
	    var intervals = timer/increment;
	    setTimeout (function () {
	                alert("прошло " + intervals + " cекунд");								
	                dynamicAlert(timer, increment, end);	
	             }, timer);
	    timer += increment;	
	}
	else return false;	
}

dynamicAlert (1000, 1000, 5000);
добавил ещё условие выхода из рекурсии =)

Arramis 24.07.2013 18:52

danik.js,
а почему в твоём коде прибавляются ещё какие - то 1, 2 милисекунды каждый раз ? это таймер по дефолту прибавляется чтоли ?

рони 24.07.2013 19:19

Arramis,
Реальная частота срабатывания


Часовой пояс GMT +3, время: 11:27.