【问题标题】:Function only executes once in for loop函数只在for循环中执行一次
【发布时间】:2021-08-07 12:42:26
【问题描述】:

我有一个函数可以启动一个可以暂停的计时器。现在我想要几个计时器一个接一个地运行,为此我决定使用 for 循环。

但是,当我在循环内调用函数时,即使循环执行 n(在本例中为 5)次,该函数也只执行一次,而 console.log 则按预期执行 5 次。我在这里做错了什么?

var timer = null;

const resetTimer = () => { 
  clearInterval(timer);
  timer = null;
}

function trigger (startTime, endTime, sets){
  for (let i = 0; i < sets; i++){
    myTimer(startTime, endTime, sets);
    console.log("1")
  }
}


function myTimer (startTime, endTime, sets){
        if (!timer) {
            timer = setInterval(function() { 
                display.innerHTML = hhmmss(++startTime);
                if (startTime >= endTime) {
                  resetTimer();
                }
            }, 1000);
        }
}

【问题讨论】:

  • 您只有 1 个 timer 变量。启动第一个间隔计时器后,其他任何一个都不会启动,因为 if (!timer) 将失败。

标签: javascript html function for-loop


【解决方案1】:

你的函数每次都会被调用,但在第一次调用之后的所有调用中,if (!timer) 都是假的,所以它什么都不做。

如果您需要多个计时器,则需要多个位置来存储计时器句柄。例如,在myTimer 内的本地:

// No global `timer`

// Accept the timer to clear (no real reason for this function if all it does is `clearInterval`)
const resetTimer = (timer) => { 
    clearInterval(timer);
};

function trigger (startTime, endTime, sets){
    for (let i = 0; i < sets; i++){
        myTimer(startTime, endTime, sets);
    }
}

function myTimer(startTime, endTime, sets) {
    // There's a different `timer` for each call to `myTimer`
    const timer = setInterval(function() { 
        display.innerHTML = hhmmss(++startTime);
        if (startTime >= endTime) {
            // Pass this timer's `timer` to `resetTimer`
            resetTimer(timer);
        }
    }, 1000);
}

【讨论】:

  • 能否请您重复一下您在多个地方存储计时器句柄的意思?我正在寻找的功能基本上是一个计时器,它最多计数到 n,暂停,然后再次自动计数到 n。我无法与您一起回答。谢谢!
  • @Hubris - 每次调用 myTimer 都会获得一个新的 timer 局部变量(常量)。因此,您启动的多个计时器中的每一个都会记住它的句柄。当它到达结束时间时,它使用该句柄来清除计时器。 (清除计时器不会重新启动它。代码中没有任何内容表明您想要重新启动计时器)。
【解决方案2】:

你已经使用了if (!timer) {,所以在第一次迭代中它会为定时器分配一些东西,之后if里面的任何东西都不会再次执行。

【讨论】:

  • 但是我不是在完成后用我的 resetTimer() 函数将计时器重置为空吗?
  • 是的,1 秒后,您的循环已经完成。
最近更新 更多