根据条件更改setInterval的MS

时间:2013-12-18 16:22:24

标签: javascript

我正在尝试更改程序迭代数组的速度,并将信息放入我的文本区域。但我不认为我完全理解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);
        }
    })();
};

1 个答案:

答案 0 :(得分:2)

setTimeoutsetInterval每次调用时都会创建一个新的计时器。如果你想拥有一个计时器,但是要改变它的执行频率,那么你需要删除它并用新的时间“设置”,如下所示:

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创建递归函数时,您不需要重置计时器。