работает очень просто:
хотите создать таймер?
пишите
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()