Циклическое выполнение кода

fire-one

Новичок
Циклическое выполнение кода

Доброго времени суток

Моя задача - организовать обновляющийся DIV каждые Н секунд. Для этого использую следующий код:

PHP:
function startClock(){
	ajax_loadContent('RandUsersDiv','randusers.php');
	alert("fg");
	setTimeout("startClock()", 5000)
}
но данный код обновляет DIV только один раз, а далее просто высвечивается алерт и все.
в чем бок ?
 

AmdY

Пью пиво
Команда форума
алерт останавливает выполнения до закрытия
 

fire-one

Новичок
алерт я использовал только для того чтобы визуально знать когда срабатывает счетчик
даже без алерта контент загружается только один раз
 

AmdY

Пью пиво
Команда форума
тогда ошибка в ajax_loadContent, таймаут работает
проверь
function startClock(){
alert("start");
ajax_loadContent('RandUsersDiv','randusers.php');
alert("end");
setTimeout("startClock()", 5000)
}
 

kode

never knows best
;

что то меня температурит, и писать развёрнутые ответы о вреде неследованию синтаксиса не хочется....просто вынеси за скобки, и поставь ;
 

MiRacLe

просто Чудо
Код:
alert("start");
ajax_loadContent('RandUsersDiv','randusers.php');
alert("end");
Это будет выполнятся в задуманном автором порядке, только если ajax_loadContent загружает данные синхронно (т.е. не AJAX вовсе).

setTimeout нужно запускать в callback-е функции ajax_loadContent, а не ловить удачу...
 

dimagolov

Новичок
MiRacLe, если запускать setTimeout в callback-е, то периодичность и близко не будет соблюдена, правда порядок вывода результата да. Кроме того, надо и в обработчике ошибок это делать, а не все либы позволяют кастомную обработку к примеру 500 ошибки сервера при ajax запросе, а лезть в либу автор может и не захотеть.
Но контролировать порядок вывода можно на стороне сервера, так как реально важен не порядок, в котором отправленны запросы, а в котором серавер отправляет ответы, так что счетчик в сессии и передача его в результате с контролем при выводе вполне решает вопрос рассогласования при передаче.

ИМХО правильное решение - setInterval на запуск ajax запроса, но с периодичностью в среднем достаточной для получения отклика от сервера до следущего вызова.
Почему так - потому что setTimeout в теле вызываемой по нему же ф-ии это плохо по множеству причин, начиная с особенности работы таймера JS, так как более ли менее вменяемая переодичность нужна.
 

MiRacLe

просто Чудо
setInterval на запуск ajax запроса, но с периодичностью в среднем достаточной для получения отклика от сервера до следущего вызова.
средняя температура по палате (ц)

Дети мегабитных каналов и core 4 quad...
с setInterval в первом приближении будет соблюдена периодичность запросов, а вот периодичность ответов будет в прямой зависимости от скорости ветра и солнечной активности и в обратной от настроения админов провайдера...
 

dimagolov

Новичок
Ну на самом деле, нам глубоко фиолетово, что ответ на первый запрос придет тогда, когда клиент отправит 5-й запрос. Ну и что, что задержки большие, следим за порядком и выводим те ответы, что актуальнее последнего отображенного. Главное, чтобы размер отклика был не столь большим, чтобы именно его прием клиентом занимал меньше времени, чем интервал между запросами, потому что иначе они забьют канал и будут умирать на провайдере по таймауту. А какие сумарные задержки при передаче сервер-клиент, это особо не существенно.
 

MiRacLe

просто Чудо
я про то вещаю, что пять запросов отправлялись исправно в течении 50-ти секунд, а ответы на все пять запросов придут подряд на 51-ой секунде...
 

fire-one

Новичок
к сожалению не мог своевременно поправить развитие ветки
меня не интересует точность в 5 секунд.
таймер работает нормально
проблема в том что не выполняется ajax_loadContent

-~{}~ 12.05.08 17:28:

пробую следующее:
Код:
	setInterval("ajax_loadContent('RandUsersDiv','randusers.php');", 10000)
результат тот же - контент загружается только один раз
 

dimagolov

Новичок
JOSS-PHP, ты всерьез думаешь, что в этом деле?

fire-one, ну отлаживай. смотри отправляются ли запросы просматривая хедеры запросов-откликов в броузере, смотри логи сервера, что он получает и что отправляет.

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

п.с. там в реальном коде в параметрах ajax_loadContent точно строки, а не переменные?
я вообще для такого пользуюсь замыканиями:
PHP:
setInterval(function () { ajax_loadContent('RandUsersDiv','randusers.php');}, 10000);
 

MiRacLe

просто Чудо
[telepat_mode]
В коде ajax_loadContent затесалась глобальная переменная, значение которой влияет на ход событий...

Код:
  b = 0;
  function a() {
     if (b != 1) { //omg
        do_something();
     }
  }
  function do_something() {
      b = 1; // mazafakashit
  }
   a(); // oh yeah
   a(); // wtf ?!?
[/telepat_mode]
 

fire-one

Новичок
c фреймворком предложенным астериксо все работает.
сенк всем за ответы
 

AmdY

Пью пиво
Команда форума
просто сейчас ты прецепил около 100к лишнего кода вместо того чтобы выслушать умные замечания MiRacLe
 
Сверху