我正在尝试更改程序迭代数组的速度,并将信息放入我的文本区域。但我不认为我完全理解setInterval和setTimeout的功能,或者可能是其他东西,我对JS来说很新。
var theStage,getDrop,getSize,time,isChecked,turbo;
function changeFrame(stopper){
if(isChecked === true){
turbo = 50;
}
else{
turbo = 250;
}
time = setInterval(start, turbo);
}
function start(){
var frames = theStage.value.split("=====\n");
var i = 0, l = frames.length;
(function iterator() {
theStage.value = frames[i];
if(++i<l) {
setTimeout(iterator, turbo);
}
})();
};
答案 0 :(得分:2)
setTimeout
和setInterval
每次调用时都会创建一个新的计时器。如果你想拥有一个计时器,但是要改变它的执行频率,那么你需要删除它并用新的时间“设置”,如下所示:
var timer = null;
...
// Each time, before creating a new timer, remove the old one.
if (timer !== null)
clearInterval(timer)
timer = setInterval(...);
我认为,您的代码可以简化为仅使用一个计时器:
var theStage, isChecked, delay;
var frames = theStage.value.split("=====\n");
var progress = 0, l = frames.length;
function changeSpeed() {
if (isChecked)
delay = 50;
else
delay = 250;
}
function processFrame() {
theStage.value = frames[progress];
if (++progress < l)
// Recursively call self until whole list of frames is processed.
setTimeout(processFrame, delay);
}
当您使用setTimeout
创建递归函数时,您不需要重置计时器。