работает очень просто:
хотите создать таймер? пишите timer(время, калбак, пеоердичность_калбака), периодичность можно не писать, по дефолту 1 секунда создаст анонимный таймер который доступен по номеру создания, начиная с нулевого в данном случае так timer(0) калбак принимает 2 аргумента, сколько времени осталось и сколько времени прошло. можно создавать именованные таймеры timer(имя, время, калбак, пеоердичность_калбака) именованные таймеры доступны как timer('имя') время можно задавать как в миллисекундах так и массивом в порядке [секунды, минуты, часы] . если нужны только секунды, то часы и минуты можно не писать. и.т.п. таймеры имеют методы .stop() //приостановка и .start() //продолжение с текущего места расширять можно через интерфейс timer.fx например: timer.fx.MyFunctionName = function(){ бла бла бла} , где таймер доступен как this
function timer (name_, time_, call_, every_, after_){
//ссылка на таймер
var timer = arguments.callee,
thisTimer,
intervalId,
name,
time,
call,
every
// timer.timers [] - таймеры
// timer.fx {} функции таймеров
switch (typeof arguments[0])
{
//если первым аргументом передан обьект
case 'object':
log('object')
break
case 'string':
//если не передано ни чего кроме строки
if(arguments.length == 1)
{
//вернуть таймер по имени
return timer.timers[arguments[0]]
}
else{ //иначе использовать её как идентефикатор таймера
name = arguments[0]
//если второй аргумент массив
if(arguments[1] instanceof Array)
{
var timeArr = arguments[1],
s = timeArr[0],
m = timeArr[1] || 0,
h = timeArr[2] || 0
time = (h*3600 + m+60 + s) * 1000
}
else {
time = arguments[1]
}
call = arguments[2] || function(){}
every = arguments[3] || 1000
//сохранить id и запустить интервал каллера
intervalId = setInterval(function(){
//обновить значения таймера
thisTimer.update()
//вызвать калбак (осталось, прошло)
call(thisTimer.last, thisTimer.passed)
}, every)
//создать таймер
thisTimer = {
startTime : (new Date()).getTime(), //время когда был запущен таймер
time : time, //на сколько установлен таймер
last : time, //осталось
passed : 0, //прошло
call : call, //функция которая будет вызываться каждые сколько нсколько миллисекунд
every : every, //вызывать калбак каждые...
intervalId : intervalId, //id интервала калбака
__proto__ : timer.fx //методы таймеров
}
//добавить таймер в список таймеров под именем таймеров
timer.timers[name] = thisTimer
}
break
case 'array':
log('array')
break
case 'number':
//если не передано ни чего кроме числа
if(arguments.length == 1)
{
//вернуть таймер по номеру
return timer.timers[arguments[0]]
}
time = arguments[0]
call = arguments[1] || function(){}
every = arguments[2] || 1000
//сохранить id и запустить интервал каллера
intervalId = setInterval(function(){
//обновить значения таймера
thisTimer.update()
//вызвать калбак (осталось, прошло)
call(thisTimer.last, thisTimer.passed)
}, every)
//создать таймер
thisTimer = {
startTime : (new Date()).getTime(), //время когда был запущен таймер
time : time, //на сколько установлен таймер
last : time, //осталось
passed : 0, //прошло
call : call, //функция которая будет вызываться каждые сколько нсколько миллисекунд
every : every, //вызывать калбак каждые...
intervalId : intervalId, //id интервала калбака
__proto__ : timer.fx //методы таймеров
}
//добавить таймер в список таймеров
timer.timers.push(thisTimer)
}
}
timer.timers = []
timer.fx = {
//обновить значение таймера
update : function(){
this.last = this.time - ((new Date()).getTime() - this.startTime) //осталось
this.passed = this.time - this.last //прошло
},
//остановить таймер
stop : function(){
//остановить калбак
clearInterval(this.intervalId)
},
//продолжить таймер
start : function(){
//ссылка на текйщий таймер
var thisTimer = this;
//время запуска
this.startTime = (new Date).getTime() - this.passed
thisTimer.intervalId = setInterval(function(){
//обновить значения таймера
thisTimer.update()
//вызвать калбак (осталось, прошло)
thisTimer.call(thisTimer.last, thisTimer.passed)
}, thisTimer.every)
}
}
timer('myTimer' ,[0,1], function(l,q){
log(l)
})
timer('myTimer').stop()
timer('myTimer').start()
|
в данный момент наполняю таймеры методами через timer.fx
и пишу движок таймер-селекторов. и естественно пространства имен, куда же без них;) так же думаю запилить иерархию таймеров) дочерние таймеры смогут приостанавливать родительские, и пораждать в свою очередь дочерние относительно себя. в будущем планитуется сделать стек выполняющихся таймеров. точнее массив стеков. так как несколько таймеров могут выполняться одновременно. так же нужно прорабоатать систему адресации таймеров в двумерном стеке.. чтобы они могли прыгать с одного места на другое. нудно додумать иерархичность таймеров, сайчас они равны.и приоритет имеют те которые обьявленны раньше. надо это исправить. планируется перекупить несколько специалистов с разработки jQuery / так как у них неплохой опыт в разработке крупных проектов). |
Цитата:
|
Цитата:
)))) |
Livanderiaamarum, можно подумать, на них кто-то посягал...
|
Скажу одно: для нормального быстродейстия все таймеры должны выполняться одним единственным setTimeout'ом(ни в коем случае не setInterval'ом). Всё остальное - ваше дело.
|
Цитата:
timer.update() для нужного таймера. дело в том что у калбаков могут быть задано разное время. например кто-то захочет вызывать калбак не раз в секунду. как по дефолту,а чаще или реже.... но я с вами согласен, сделаю массив таймеров в которых не указали ИНОЕ от секунды время калбаков, и буду его вызывать одним сеттаймаутом. так и собирался просто пока ядро пишу. |
Livanderiaamarum, иди поработай, что ли. А то ты скоро ось для таймера напишешь.
Таймовс) |
Цитата:
|
Цитата:
Я тогда логотипом могу посоветовать взять "текущие" часы Дали) Или надкушенные... |
| Часовой пояс GMT +3, время: 12:31. |