我正在尝试通过递增/递减所需的时间来获取jquery函数以在列表中的同一时间帧中接近不同的数字。那是我有一个清单:
// (initialised outside the function scope)
var numbers = [10, 5, 13, 1, 1000];
var curNumber = 0;
var i = 0;
该功能应该花费与curNumber = 0 to number[0] = 10
相同的时间(例如1秒)到达curNumber = 0 to number[4] = 1000
。在上面的列表中,代码将在1秒内完成每个循环,从0到10到5到13到1到1000(如果最初curNumber = 0
则总共5秒)。
我的目标是一个连续运行的简单功能,例如:
while(true) {
if (curNumber < numbers[i])
curNumber++;
else if (curNumber > numbers[i])
curNumber--;
if (curNumber == numbers[i]) {
alert(numbers[i] + " number reached!");
i > numbers.length ? i = 0 : i ++;
}
}
计时器按钮如下所示:
$("#start").click(function() {
myTimerFunction();
});
我应该使用var refreshId = setInterval(function(){},1000);功能? - 或者只是每隔1000毫秒运行一次这个函数与数字接近的速度无关?
答案 0 :(得分:1)
我不完全确定“更改速率”是什么意思,但是如果在执行期间调用之间的延迟会发生变化(即,进程应该加速或减慢),那么我会使用{{ 1}}让函数排队下一次调用自己,用一个变量来指定延迟:
setTimeout()
如果间隔保持不变,那么var delay = 1000;
function myTimerFunction() {
// do something
// ...
if (someCondition) {
// change delay somehow
}
setTimeout(myTimerFunction, delay);
}
就可以了,不过我个人更喜欢使用setInterval()
,因为我通常会发现使用以下代码更简单:
setTimeout()
...决定是否保持“循环”而不是保存时间间隔ID,然后在稍后再次调用 if (someCondition)
setTimeout(myTimerFunction, delay);
之前调用clearInterval()
。
答案 1 :(得分:0)
使用像这样的持有人变量refreshId应该没问题。要更改计时器,你只需要这样的东西:
var numberStep = function () {
if (curNumber < number[i])
curNumber++;
else if (curNumber > number[i])
curNumber--;
if (curNumber == number[i]){
alert(number[i] + " number reached!");
i++; //(or if i > numbers.length change to 0)
}
};
var myTimerFunction ( interval, currentTimer ) {
if ( currentTimer ) clearInterval(currentTimer);
return setInterval( numberStep, interval );
};
var refreshId = myTimerFunction( startingInterval );
然后,只要您想更改间隔,就可以使用refreshId = myTimerFunction( newInterval, refreshId );
。在您在评论中提供的示例中,您将startingInterval
设置为1000,将newInterval
设置为500。