работает очень просто:
хотите создать таймер? пишите 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, время: 02:04. |