[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: динамически меняющийся интервал в setInterval
eaborodkin
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>

<
div id="include"></div>
<
script type="text/javascript">
function sync()
{
$.ajax({
type: 'POST',
dataType: 'json',
url: 'sync.php',
success: function(jsondata){
ar_ids = jsondata;
}
}
);
}


function contentUpdate(n)
{
if (i==ar_ids.length){i=0};
$("#include").load(
"content.php",
{
ID: n
}
);
}
var i=0;
sync();
contentUpdate(i);
setInterval(function(){sync();}, 60000);
setInterval(function(){contentUpdate(++i);}, 5000);
</
script>

День добрый. есть вот такой код^
В setInterval(function(){contentUpdate(++i);}, 5000) надо вместо 5000 подставлять значения из массива ar_ids. Будет ли нормально работать функция setInterval, т.е. менять задержку не с постоянным заданным интервалом, а с динамически меняющимся? Могу ли Я просто подставить вместо 5000 что-то типа ar_ids[i]?



Спустя 34 минуты, 52 секунды (9.08.2012 - 13:28) eaborodkin написал(а):
вот частичное решение проблемы http://javascript.ru/forum/events/27365-ne...etinterval.html но как тогда сделать с setTimeout? Насколько знаю с ним много проблем, если его использовать в таком ключе...

Спустя 53 минуты, 3 секунды (9.08.2012 - 14:21) alexbel2404 написал(а):
это не частичное, а полное решение) Там все верно написано. Меняй на setTimeout и прогоняй ar_ids через цикл.

Спустя 4 минуты, 25 секунд (9.08.2012 - 14:25) eaborodkin написал(а):
а не получится вот такой ситуации с setTimeout()? http://ir2.ru/setinterval.aspx

Спустя 20 минут, 30 секунд (9.08.2012 - 14:46) alexbel2404 написал(а):
function sleep(numberMillis){
var now = new Date();
var exitTime = now.getTime() + numberMillis;
while (true){
now = new Date();
if (now.getTime() > exitTime) return;
}
}


а если такую ф-ию юзать? в конце тела цикла ставить sleep(тут_число_в_милисекундах_их_массива_ar_ids);

Спустя 9 минут, 57 секунд (9.08.2012 - 14:55) eaborodkin написал(а):
прикольно) типа самодельный счётчик?))
Попробую...
Вопрос: (true) это костыль в данном случае?

P.s. Почему разработчики js не внесут штатную функцию по типу этой sleep()?

Спустя 47 секунд (9.08.2012 - 14:56) Игорь_Vasinsky написал(а):
нет. это значит не останавливаться, типа 1==1

Спустя 1 минута, 51 секунда (9.08.2012 - 14:58) eaborodkin написал(а):
ну, Я это и имел ввиду)

Спустя 19 часов, 20 минут, 42 секунды (10.08.2012 - 10:19) eaborodkin написал(а):
alexbel2404
Спасибо, за функцию, помогла очень.(лайк поставить пока не могу, т.к. новичок)

Короче, подточил свой скрипт

<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>

<
div id="include"></div>
<
script type="text/javascript">
var i=0;
var ar_ids;
var id;
var delaytime;
var len;
function sync()
{
$.ajax({
type: 'POST',
dataType: 'json',
url: 'sync.php',
success: function(jsondata)
{
ar_ids = jsondata;
len = ar_ids.length;
}
}
);
};

function contentUpdate(){ alert(1);
if(i==len){i=0;};
id=ar_ids[i];
$("#include").load(
"content.php",
{
ID: id['ID']
}
);
i++;
};

function sleep(numberMillis){
var now = new Date();
var exitTime = now.getTime() + numberMillis;
while (true){
now = new Date();
if (now.getTime() > exitTime) return
}
}


function contUp(){
contentUpdate();
if(id['PROPERTY_TIME_M_VALUE']==null) {id['PROPERTY_TIME_M_VALUE']=0;};
if(id['PROPERTY_TIME_S_VALUE']==null) {id['PROPERTY_TIME_S_VALUE']=10;};
delaytime=(id['PROPERTY_TIME_M_VALUE']*60+id['PROPERTY_TIME_S_VALUE'])*1000;
sleep(delaytime);
};

sync();
contentUpdate();
setInterval(function(){sync()}, 60000);
while (true) {
contUp();
}
</script>

он работает, но только когда есть вот этот alert(1). Если его нет, то не работает, а в FireBug пишет

ar_ids is undefined
contentUpdate()

id=ar_ids[i];

Я так понял, что когда нет alert, то он не успевает определить переменную ar_ids. Видимо sync.php ещё не вернул ответ, а js уже побежал вперёд... Но это мои догадки...
В чём трабла? С остановкой на alert(1) работает, без неё нет.

Спустя 51 минута, 55 секунд (10.08.2012 - 11:11) eaborodkin написал(а):
И, кстати, с alert(1) начинает пахать только в FF.

Спустя 12 минут, 19 секунд (10.08.2012 - 11:23) killer8080 написал(а):
eaborodkin
а нафига вообще нужны эти пляски с бубном? Не проще контент выводить сразу, после получения?

Спустя 5 минут, 49 секунд (10.08.2012 - 11:29) eaborodkin написал(а):
в success? а что-то изменится?

дело в том, что sync() у меня всего лишь синхронизирует информацию с базой данных раз в 60 сек. Получается, что она у меня работает асинхронно с выводом #content. Получается, что мне впринципе не надо привязываться к success.

Спустя 4 часа, 13 минут, 57 секунд (10.08.2012 - 15:43) eaborodkin написал(а):
поможите, плиз)

Спустя 48 минут, 17 секунд (10.08.2012 - 16:31) killer8080 написал(а):
Цитата (eaborodkin @ 10.08.2012 - 16:43)
поможите, плиз)

трудно помочь, не понимая сути задачи. Ты пытаешься сделать динамическую подгрузку новостей? Или что? Зачем нужно менять таймаут?

Спустя 2 дня, 16 часов, 20 минут, 19 секунд (13.08.2012 - 08:51) eaborodkin написал(а):
надо сделать что-то типа рекламной доски, где на экране объявление будет отображаться определённое время.

Спустя 3 минуты, 18 секунд (13.08.2012 - 08:55) killer8080 написал(а):
Цитата (eaborodkin @ 13.08.2012 - 09:51)
где на экране объявление будет отображаться определённое время

Объявление будет одно? Или несколько?

Спустя 39 минут, 18 секунд (13.08.2012 - 09:34) eaborodkin написал(а):
сами объявления у меня в битриксе, есть страничка с инфоблоком, это как раз content.php который по переданному ID отображает нужный элемент. Список отображаемых элементов получаю в sync.php с помощью метода битрикса и возвращаю json'ом. Таким образом произвожу синхронизацию списка с сервером, т.е. если в какой-то момент будет добавлено новое объявление, то после синхронизации оно тоже начнёт отображаться на доске объявлений. У каждого элемента задаётся отдельное свойство с временем отображения.

Спустя 3 минуты, 35 секунд (13.08.2012 - 09:38) eaborodkin написал(а):
ну конечно несколько, Я ж целый массив получаю с помощью sync.php

Спустя 5 часов, 21 минута, 30 секунд (13.08.2012 - 14:59) eaborodkin написал(а):
народ как найти ошибку? Подскажите, а то пропаду, уже сколько времени голову ломаю(((

Спустя 3 минуты, 8 секунд (13.08.2012 - 15:02) Игорь_Vasinsky написал(а):
смотреть консоль JS

Спустя 29 минут, 23 секунды (13.08.2012 - 15:32) eaborodkin написал(а):
вот единственная ошибка в консоли:
prompt aborted by user	

throw Components.Exception("prompt aborted by user", Cr.NS_ERROR_NOT_AVAILABLE)

Спустя 27 минут, 15 секунд (13.08.2012 - 15:59) eaborodkin написал(а):
о... щас ещё идея появилась решения всей этой задачи, в корне отличная от этой!
Может мне сделать счётчик посекундный, типа setInterval(function(){t++},1000) и получается не делать вообще пауз, а скорее сделать что-то типа расписания, запускать в нужное t нужную функцию с нужным параметром)) Чёрт, буду параллельно этот вариант пробовать, раз предыдущий заглох...

Спустя 6 часов, 5 секунд (13.08.2012 - 21:59) killer8080 написал(а):
Цитата (eaborodkin @ 13.08.2012 - 10:38)
ну конечно несколько, Я ж целый массив получаю с помощью sync.php


Я вообще не понимаю, какой смысл аяксом запрашивать массив айдишников сообщений, а потом каждый по отдельности подгружать? Почему бы сразу не получить все эти сообщения одним запросом? Если конечно они действительно отображаются одновременно. Потом просто периодически опрашивать не появились ли новые сообщения, и подгружать их по мере появления. Зачем постоянно тянуть с сервера одни и те же сообщения? И зачем нужен переменный интервал опроса?

Спустя 10 часов, 47 минут, 35 секунд (14.08.2012 - 08:47) eaborodkin написал(а):
объявления отображаются поочереди, с указанным для каждого временем показа.
Мне сложнее организовать алгоритм проверки на новые объявления, чем каждый раз просто загружать "свежий" список.
интервал опроса не переменный, у меня используется два асинхронно работающих аякс-запроса:
1) синхронизирует список объявлений с базой битрикса;
2) выводит очередное объявлениЕ из списка на экран.

Спустя 2 часа, 28 минут, 38 секунд (14.08.2012 - 11:15) eaborodkin написал(а):
Цитата (eaborodkin @ 13.08.2012 - 16:59)
о... щас ещё идея появилась решения всей этой задачи, в корне отличная от этой!
Может мне сделать счётчик посекундный, типа setInterval(function(){t++},1000) и получается не делать вообще пауз, а скорее сделать что-то типа расписания, запускать в нужное t нужную функцию с нужным параметром)) Чёрт, буду параллельно этот вариант пробовать, раз предыдущий заглох...


<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<
div id="time"></div>
<
div id="include"></div>
<
script>
var second=<?=time();?>;
var i=0;
var ar_ids;
var id;
var synctime;
var len;
var delaytime=second;
function sync()
{
$.ajax({
type: 'POST',
dataType: 'json',
url: 'sync.php',
success: function(jsondata)
{
ar_ids = jsondata;
len = ar_ids.length;
synctime = second+60;
}
}
);
};

function contentUpdate(){
if(i==len){i=0;};
id=ar_ids[i];
$("#include").load(
"content.php",
{
ID: id['ID']
},
function(){
if(id['PROPERTY_TIME_M_VALUE']==null) {id['PROPERTY_TIME_M_VALUE']=0;};
if(id['PROPERTY_TIME_S_VALUE']==null) {id['PROPERTY_TIME_S_VALUE']=10;};
delaytime=second+(+id['PROPERTY_TIME_M_VALUE'])*60+(+id['PROPERTY_TIME_S_VALUE'])+1;
}
);
i++;
};

function display(){
second++;
if(synctime<=second)sync();
if(delaytime<=second)contentUpdate();
//document.getElementById('time').innerHTML = second;
}
sync();
setInterval(function(){display();},1000);
</
script>

Всё пашет))

Спустя 2 минуты, 25 секунд (14.08.2012 - 11:18) eaborodkin написал(а):
Вопрос по jguery! Как сделать эффект плавного исчезновения старого содержимого и плавного появления нового содержимого?

Спустя 4 минуты, 56 секунд (14.08.2012 - 11:23) killer8080 написал(а):
eaborodkin
я бы эту задачу решал бы иначе. По загрузке страницы загружаем полный список объявлений, вставляем сразу все в тело документа в виде скрытых блоков. По таймеру делаем запросы на наличие новых объявлений, и добавляем по мере появления. Отдельная функция по таймеру перебирает эти блоки, видимый блок скрывает, а следующий делает видимым по кругу, в общем делаем простую ротацию. Как то так. И ненужна гонять лишний трафик, и грузить сервак бессмысленной работой.

Спустя 20 минут, 37 секунд (14.08.2012 - 11:43) eaborodkin написал(а):
впринципе, интересное решение) тока наверное оставлю как есть, т.к. до конца недели надо ещё кучу плюшек и условий прикрутить...
По эффекту подскажите)

p.s. killer8080
если бы Я сделал по твоему варианту, то в момент синхронизации могло бы моргание(обновление) быть видно, а у меня в фоновом режиме.

Спустя 17 минут, 28 секунд (14.08.2012 - 12:01) killer8080 написал(а):
Цитата (eaborodkin @ 14.08.2012 - 12:43)
если бы Я сделал по твоему варианту, то в момент синхронизации могло бы моргание(обновление) быть видно, а у меня в фоновом режиме.

И с чего бы это?

Цитата (eaborodkin @ 14.08.2012 - 12:43)
По эффекту подскажите)

Спустя 1 час, 30 минут, 2 секунды (14.08.2012 - 13:31) eaborodkin написал(а):
да Я чё-то туплю, не пойму как в моё решение этот эффект вклинить...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.