Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   реализация таймлайн (https://javascript.ru/forum/misc/2514-realizaciya-tajjmlajjn.html)

Bajjy 09.01.2009 02:16

реализация таймлайн
 
Есть множество функций которые вызываются при определенных условиях и выполнять их нужно с определенной периодичностью.
Чтоб не вешать на каждую функцию отдельный setTimeout есть идея сделать функцию-таймлайн, в которую можно было бы добавлять функции требующие периодического выполнения с информацией о интервале выполнения. Когда функцию больше ненужно выполнять удалять ее из таймлайна.

Пример того, что я хочу (в очень убогом виде:) ) выглядит так :
var a=5; //это типа интервал добавленной ф-ции
var cycle=0;
timeline = function (){ //изначально timeline пуста
	if (a == 0){
		prim();
		a=5
	}
a--	
setTimeout(timeline,1)	
}
prim(){cycle++} //нуждается в периодическом выполнении

спасибо

Zibba 09.01.2009 02:27

А в чем вопрос!?

Bajjy 09.01.2009 02:37

изначально ф-ция таймлайна выглядит так:
timeline = function (){
setTimeout(timeline,1)
}

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

Octane 09.01.2009 12:05

Добавляйте функции в массив и каждый раз по таймеру пробегайте по элементам (функциям) массива и запускайте их.

Bajjy 09.01.2009 13:03

:)
все бы хорошо, только интервал-то у ф-ций может быть разный.
предлагаете задать отдельный массив для переменных-интервалов?

Octane 09.01.2009 13:50

Как вы все это синхронизировать собрались в одной функции, если интервалы могут быть разные. Активное ожидание потребует слишком много ресурсов и скрипт будет остановлен, а допустим, если ввести ограничение, чтобы интервал, по которому будут запускаться функции не был меньше 10мс, и проверять каждые 10мс, то из-за погрешностей таймеры не будут совпадать. Да и необходимость решения подобной задачи в JavaScript не понятна, зачем вам это?

Bajjy 09.01.2009 14:31

Я сталкивался с проблемой когда из за лагов браузера функции которые должны выполняться синхронно (с разными сетТаймаутами) глючили и выполнялись не синхронно. Обычно это незаметные доли секунды, но из-за погрешности, со временем не синхронность становится заметной. А если все ф-ции выполняются одним сетТаймаутом, то и ступор подействует на все, а значит никакой погрешности не будет.
Если реализовать активное ожидание через if (как я писал в топе), например, это займет много ресурсов?

Kolyaj 09.01.2009 22:08

Что значит синхронно? JavaScript однопоточный язык, одновременно все равно выполняться не будет.

Bajjy 09.01.2009 22:37

:)
настолько синхронно насколько может позволить JS

ZoNT 11.01.2009 11:50

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

Bajjy 11.01.2009 13:39

так что, надежды нет совсем?

ZoNT 11.01.2009 13:40

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

Bajjy 11.01.2009 17:19

Выше писал. Не один раз.
Мой мозг абсолютно отказывается думать в другом направлении. Буду признателен если, хотя бы натолкнете на мысль о решении

ZoNT 11.01.2009 18:38

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

Bajjy 11.01.2009 20:37

без функций может и можно, но без таймеров никак. по крайней мере 1 нужен.

Задача.
Представьте. Страница, на ней множество, скажем, картинок. Картинки можно двигать, картинки имеют "вес" (т.е. каждая картинка двигается с разной скоростью) и их может быть очень много. Картинки можно двигать партиями (выделив несколько) и они имеют "продолжительность жизни". По окончании его стираются со страницы. Картинки эти могут появляться переодически.

ZoNT 12.01.2009 11:34

жесть... Самостоятельно двигающиеся картинки на сайте...
Тогда тебе нужна всего одна функция срабатывающая по таймеру. Таймер самый минимальный. И в зависимости от значения сдвигающая картинки. Что-то типа:
var start = new Date();
function move(){
var picts = {
  'pict1':3,
  'pict2':5,
  'pict3':15,
  'pict4':1,
  'pict5':2
}
for(var i in picts)
  if ( ((new Date())-start) % picts[i] == 0) imgs[i].MOVE_KUDA_NIBUD();
}

setInterval(move,1);


Пример не рабочий, но суть отражает...

alekciy 12.01.2009 21:56

Новый русский гуляет с сыном по набережной. На берегу сидит художник и рисует пейзаж. Новый с обращением к сыну:
-Ну вот видишь, сынок, как народ то без палароида мучится...

Во избежании вывиха мозга автора дают наводку: Планировщик задач на JavaScript (хотя я с ней и не согласен) ;)

Bajjy 13.01.2009 00:47

ZoNT,
Спасибо.
alekciy,
Спасибо. Это вроде то, что нужно.
Но я не любитель чужих библиотек :D поэтому разберусь с кодом и напишу что-то свое.

alekciy 13.01.2009 03:55

К чему я вспомнил анекдот то... как уже правильно писали в коментах, имхо, пытаться делать из JS операционную системы не стоит. А уж для однопоточной реализации тем более.

Bajjy 13.01.2009 22:22

Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik


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