Можно так:
/**
*
* @param duration - продолжительность работы таймера
* @param interval - время тика таймера
* @param from - начальное значение
* @param to - конечное значение
* @param minStep - минимальный шаг вызова callback
* @param callback - обработчик
*/
function timer(duration,interval,from,to,minStep,callback){
var value=from,
forward=(from<to),
range=Math.abs(to-from),
steps=duration/interval,
step=range/steps,
last=from,
handle=setInterval(function(){
value+=step*(forward?1:-1);
if(forward?value>to:value<to){
value=to;
clearInterval(handle);
handle=null;
}
if(!minStep||!handle||Math.abs(last-value)>=minStep){
last=value;
callback(value,from,to);
}
}
,interval);
return handle;
}
timer(800,20,50,0,1,function(value){
console.warn(Math.floor(value));
})