Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Проблемы с setTimeout().... (https://javascript.ru/forum/events/18196-problemy-s-settimeout.html)

Panter7777 21.06.2011 16:49

Проблемы с setTimeout()....
 
Добрый день!
Пишу штуку работающею по ajax передаю список через textarea потом javascripto'm разбиваю его по строчно и создаю массив. Дальше нужно бегу по массиву и вызываю другую функцию с переменными из массива. Только вызвать мне ее нужно через определенный интервал времени.
Вот код:
function SplitURL(){
	var dict = new Array();
	var link = document.getElementById('link').value;
	var back_url = document.getElementById('back_url').value;
	dict = back_url.split("\n");
	var tm = 0;
	for(var i=0; i<dict.length; i++){
		tm += 3000;
		setTimeout("SendReq(" + link + "," + dict[i] + ");", tm);
	}
}

function SendReq(link, back_url){
	
	alert(1);

}


Тоесть еденицка должна вызываться каждые 3 секунды но нет :nono: не вызвается.!!!

DreamTheater 21.06.2011 17:27

setTimeout(function() {
  SendReq.call(link, dict[i]);
}, tm);

Panter7777 21.06.2011 17:46

не работает!!!!:(

Panter7777 21.06.2011 17:58

Вот даже примитивный скрипт сразу выдает "с"
<html>
<head>
[JS]
var dict = new Array();
dict = new Array("a", "b", "c");

function timedCount(i){

 while (i<dict.length){
    document.getElementById('txt').value=dict[i];
     i += 1;

     setTimeout("timedCount(" + i + ")",2000);
   }
}
 [/JS]
</head>

<body>

<form>
<input type="button" value="Start count!" onClick="timedCount(0)">
<input type="text" id="txt">
</form>

</body>
</html>

DreamTheater 21.06.2011 18:30

Цитата:

Сообщение от Panter7777 (Сообщение 109783)
не работает!!!!:(

setTimeout(function() {
  SendReq.call(window, link, dict[i]);
}, tm);


А так?

Panter7777 21.06.2011 18:41

Так тоже не работает, елки палки, что я уже не пробовал....

Bebarr Swallow 21.06.2011 19:54

каждые три секунды? я думал setTimeout это типа таймер который выполняется только раз!?.

yashka525 21.06.2011 20:58

Попробуй setInterval что-ли...

melky 22.06.2011 10:45

Цитата:

Сообщение от Panter7777 (Сообщение 109773)
через определенный интервал времени.

ну так через интервал и сделай

потом только не забудь убрать

Panter7777 22.06.2011 12:00

Все выше перечисленное попробовал в разных вариация и плюс своего, результат тот же, паузы нет!!! Максимум что можно добиться это задержка перед первой отправкой, а дальше все!!! Может передать масив в php и там sleep()'ами по одному значению делать... фиг его знает буду что-то выдумывать.

ksa 22.06.2011 12:05

Цитата:

Сообщение от Panter7777
Все выше перечисленное попробовал в разных вариация и плюс своего, результат тот же, паузы нет!

Твая не умеет пользоваться setTimeout()... :)

<!DOCTYPE html>
<html>
<head>
<title>test</title>
<style type="text/css">
</style>
<script type="text/javascript">
function Go() {
	setTimeout(function(){Inc(0)},100)
}
function Inc(N) {
	document.getElementById('n').innerHTML=N
	N++
	if (N<11) setTimeout(function(){Inc(N)},400)
}
</script>
</head>
<body onload='Go()'>
<div id='n'></div>
</div>
</body>
</html>

nikita.mmf 22.06.2011 12:11

а если так
for(var i=0; i<dict.length; i++){
	  tm += 3000;
          (function ( url, burl, time ) {
            setTimeout(function(){
             SendReq( url, burl );
            }, time);
          }) (link, dict[i], tm)
	}

ksa 22.06.2011 12:13

Цитата:

Сообщение от nikita.mmf
а если так

Зачем вы setTimeout() суёте в циклы? :blink:

nikita.mmf 22.06.2011 12:15

ksa, не я, а автор вопроса, просто подумал, что возможно оно не работает из-за отсутствия замыкания в цикле

ksa 22.06.2011 12:17

setTimeout() должен "сам определять" следующую итерацию, а не какой-то цикл. Обращение "вы" не совсем к тебе... :) А ко всем так делающим.

nikita.mmf 22.06.2011 12:25

ksa, ну это как раз понятно, кто хоть раз писал анимацию про это должен знать:)

Panter7777 23.06.2011 12:40

Вобщем через PHP не как потому, что сколько ты пауз в нем не ставь результат вернется весь после обработки!!! А мне нужно что бы результат возвращался поэтапно, блин.

ksa 23.06.2011 14:17

Цитата:

Сообщение от Panter7777
А мне нужно что бы результат возвращался поэтапно

Пример "поэтапного возвращения" я тебе показал...

Gozar 23.06.2011 15:01

Panter7777,
не суй запросы к серверу в циклы. Сервер не будет отвечать с твоими задержками, сначала получи ответ от сервера, а потом отправляй новый запрос.

Panter7777 23.06.2011 16:52

Ура!!! Поборол)))
Всем огромнейшее спасибо!!!
Вот код кому интересно пауза в массиве при работе через Ajax:

<script type="text/javascript">
function tmp(link, dict){
		if (dict.length > 0){
			last = dict.pop(); 
			SendReq(link, last);
			setTimeout(function(){tmp(link, dict)}, 2000);
		}
}

// Сначала берем из формы значения и создаем из них массив, потом через таймаут передаем его функции tmp которая берет последний элемент массива и передает его в функцию посылающею Ajax запрос на обработчик и так далее пока в массиве не кончаться элементы!!! 
function Dict(){
	var link = document.getElementById('link').value;
	var back_url = document.getElementById('back_url').value;
	var dict = new Array();
	dict = back_url.split("\n");

	setTimeout(function(){tmp(link, dict)}, 2000);
}

function SendReq(link, back_url){
	
	var url = "link="+encodeURIComponent(link)+"&back_url="+encodeURIComponent(back_url);
// 	alert(url);
        var zz = document.getElementById('result').innerHTML; //Для того что бы новые результаты добавлялись к старым
	var req = new XMLHttpRequest();
	
	req.onreadystatechange = function () {
		if (req.readyState != 4) {
			document.getElementById('result').innerHTML="Загружаю";
		}
		if (req.readyState == 4){
			
			document.getElementById('result').innerHTML=zz + '</br>' + req.responseText;
			
		}
	}
	
	req.open("POST", "check_url.php", true);
	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	
	req.send(url);

}
</script>

</head>
<form method="POST">
......
		<button onclick="Dict(); return false">Ajax</button>
</form>

<div id="result">Результат</div>

Андрей38 05.09.2011 10:38

$('#but div').live('mouseenter',function (){
var u= setInterval(function er () {
$('#apDiv1') .hide(456).show(567)
var hi = $(this).find('p:first').text()
var fi= $('#prom img').attr('src')
//alert(hi)
//alert(fi)

},900)

так НЕ работает if(hi==fi )// if (1==1) или (1==2) a так работает

{

clearInterval(u) }


})

Замысел в том,чтоб в заданные промежутки времени проверять,равен ли var hi var fi .А если вары стали равны,ОТКЛЮЧИТЬ проверку сэтинтервалом.
В этом коде алерты выдают ПРАВИЛЬНЫЕ значения ,НО if if (hi==fi) с переменными,которые выдает алерт, не хочет сравнивать .К тому-же,похоже, последующее задействие ИФ с переменными if (hi==fi)
вырубает $('#but div').live('mouseenter', в котором, ЗИС текст,так как зис-дивы в #but перестают подсвечиваться в другом моусентере

Что здесь не так и КАК это сделать ,чтоб достичь задумки ?


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