Вход

Просмотр полной версии : Проблемы с setTimeout()....


Panter7777
21.06.2011, 16:49
Добрый день!
Пишу штуку работающею по 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>

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);
}
}

</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
не работает!!!!:(

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
22.06.2011, 12:00
Все выше перечисленное попробовал в разных вариация и плюс своего, результат тот же, паузы нет!!! Максимум что можно добиться это задержка перед первой отправкой, а дальше все!!! Может передать масив в php и там sleep()'ами по одному значению делать... фиг его знает буду что-то выдумывать.

ksa
22.06.2011, 12:05
Все выше перечисленное попробовал в разных вариация и плюс своего, результат тот же, паузы нет!
Твая не умеет пользоваться 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
а если так
Зачем вы 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
А мне нужно что бы результат возвращался поэтапно
Пример "поэтапного возвращения" я тебе показал...

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 перестают подсвечиваться в другом моусентере

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