【问题标题】:Clearing an anonymous setInterval清除匿名 setInterval
【发布时间】:2019-07-03 01:24:19
【问题描述】:

如何清除匿名 setInterval 函数,如下所示,以使 i 停止递增?

var i = 0;
setInterval(function(){
    console.log(i);
    i++;
 }, 1000);



【问题讨论】:

  • 你不能。您必须将 ref 存储到句柄。
  • clearTimeout without ID的可能重复
  • 请问你为什么不能简单地做var task = setInterval(...然后clearInterval(task)
  • 我知道你可以做var task = setInterval(...)。但是,我问是否可以在不将其设置为等于某个变量的情况下完成此操作。原因是我有一个带有匿名 setInterval 的旧 JS 文件,我不能轻易更改那个旧 JS 文件。

标签: javascript


【解决方案1】:

您需要将它存储在变量中,然后将该变量传递给clearInterval

var i = 0;
let variable = setInterval(function(){
    i++;
    console.log(i)
 }, 1000);
//to clear interval after 5 seconds to check if it works
setTimeout(() => clearInterval(variable),5000)

【讨论】:

    【解决方案2】:

    强烈不推荐!

    不过,您可以通过临时修补 window.setInterval 函数来完成此操作,以便捕获对计时器的引用。

    以下是一个综合示例,请参阅下面的实现示例。

    // Declare a variable to store the interval
    let rogueInterval = null;
    
    //Override the setInterval method
    const oldSetInterval = window.setInterval;
    window.setInterval = (...args) => {
      rogueInterval = oldSetInterval(...args);
    }
    
    
    var i = 0;
    setInterval(function() {
      console.log(i);
      i++;
    }, 1000);
    
    
    // Reset it
    window.setInterval = oldSetInterval;
    
    
    // Will clear your rogueInterval after 5 seconds
    setTimeout(() => {
      clearInterval(rogueInterval);
    }, 5000);

    听起来您正在通过script.src 包含一个脚本,因此,您需要在覆盖setInterval 之前放置一个内联脚本标记,并在重置setInterval 之后放置一个内联脚本标记:

    <script> // JS that overrides the setInterval </script>
    
    <script src="problem-file.js"></script>
    
    <script> // JS that resets the setInterval </script>
    

    不幸的是,这种方法假定问题文件中只有一个setInterval,并且setInterval 本身没有异步设置。如果您绝对需要,您可以保留猴子补丁,并检查传入函数的字符串化版本,如果它符合某些条件,则捕获它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 2016-02-09
      • 1970-01-01
      • 2021-12-29
      • 2012-08-19
      • 2020-01-12
      相关资源
      最近更新 更多