如何清除Interval?

How to clearInterval?

[编辑:非常感谢大家的帮助。我看到这个问题被一些人标记了,因为它没有显示足够的研究等。抱歉,感谢您的耐心等待!我是编码和 Whosebug 的新手 -- 还不确定规则或礼仪。]

为什么在第一个 'DONE' 之后没有停止?有什么简单的解决办法吗?

function countdown(num) {
  let n = num;
  function dec() {
    if (n > 1) {
      n--;
      console.log(n);
    } else {
      clearInterval(dec);
      console.log('DONE!');
    }
  }
  
  setInterval(dec, 1000);
}

感谢您的宝贵意见!

clearInterval 需要 setInterval returns.

的间隔 id

function countdown(num) {
  let n = num, id;
  function dec() {
    if (n > 1) {
      n--;
      console.log(n);
    } else {
      clearInterval(id);
      console.log('DONE!');
    }
  }
  
  id = setInterval(dec, 1000);
}

countdown(5)

您必须存储对计时器中 return 值的引用(用于标识它),然后使用该引用稍后清除计时器。您正试图将回调函数作为引用传递给清除。

有关详细信息,请参阅 the documentation

function countdown(num) {
  let timer = null; // <-- This will store the timer id
  let n = num;
  function dec() {
    if (n > 1) {
      n--;
      console.log(n);
    } else {
      clearInterval(timer); // <-- Pass the ID to cancel
      console.log('DONE!');
    }
  }
  
  timer = setInterval(dec, 1000); // <-- Capture the return value
}

countdown(5);

请试试这个:

function countdown(num) {
  let n = num;
  function dec() {
    if (n > 1) {
      n--;
      console.log(n);
    } else {
      clearIntervalABC();
      console.log('DONE!');
    }
  }
  function clearIntervalABC() {
    clearInterval(inter);
  }
  const inter = setInterval(dec, 1000);
}

您需要清除计时器,而不是函数

function countdown(num) {
    let n = num;
    function dec() {
        if (n > 1) {
            n--;
            console.log(n);
        } else {
            clearInterval(a);
            console.log('DONE!');
        }
    }

    const a = setInterval(dec, 1000);
}
countdown(1)

为了扩展其他人的好答案,以下代码也以更紧凑的方式实现了这一点:

let countdown = num => {
  let interval = setInterval(() => {
    if (num <= 1) {
      clearInterval(interval);
      console.log('DONE');
    } else {
      num--;
      console.log(num);
    }
  }, 1000);
}

countdown(5);