Показать сообщение отдельно
  #11 (permalink)  
Старый 16.12.2011, 23:18
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 10.12.2011
Сообщений: 290

работает очень просто:

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

Последний раз редактировалось Livanderiaamarum, 16.12.2011 в 23:25.
Ответить с цитированием