8

我想在我的代码运行时更改 setInterval 函数时间。

我试试这个

<script type="text/javascript">
        $(function () {
            var timer;
            function come() { alert("here"); }
            timer = setInterval(come, 0);
            clearInterval(timer);
            timer = setInterval(come, 10000);
        });
    </script>

第一个 SetInterval 不起作用!

4

7 回答 7

14

您正在清除下一行的间隔,因此第一个将不起作用,因为它会立即被清除:

        timer = setInterval(come, 0);
        clearInterval(timer);
        timer = setInterval(come, 10000);

此外,正如 gdoron 所说,设置无任何时间间隔并不是真正有效的,也不是一个好主意,请改用 setTimeout,或者如果不需要延迟,则直接运行该函数。

        come();
        clearInterval(timer);
        timer = setInterval(come, 10000);
于 2012-05-13T23:47:58.933 回答
7

你不能。您将需要使用 setTimeout,并重复调用它:

var timer; // current timeout id to clear
function come(){ /* do something */};
var time; // dynamic interval

(function repeat() {
    come();
    timer = setTimeout(repeat, time);
})();

有了这个,您可以设置每次repeat执行函数时应用的不同“间隔”。但是,如果在超时期间发生更改,则不会发生任何变化time,您需要为此停止超时。

于 2012-05-13T23:51:00.663 回答
2

无法直接更改函数触发的时间间隔。您能做的最好的事情是取消一个间隔并设置一个具有相同功能和更新计时器的新间隔。这是一种可能的方法:

timer = {
    timers:{},
    inc:0,
    start:function(cb,gap) {
        var key = inc;
        inc++;
        timer.timers[key] = [setInterval(cb,gap),cb];
        return key;
    },
    stop:function(id) {
        if( !timer.timers[id]) return;
        clearInterval(timer.timers[id][0]);
        delete timer.timers[id];
    },
    change:function(id,newgap) {
        if( !timer.timers[id]) return;
        clearInterval(timer.timers[id][0]);
        setInterval(timer.timers[id][1],newgap);
    }
};

用法:

var myTimer = timer.start(function() {....},1000);
// calls every second

timer.change(myTimer,5000);
// now calls every five seconds
于 2012-05-13T23:53:00.103 回答
1
timer = setInterval(come, 0); // zero isn't a valid interval...

你可能想要:

come();
timer = setInterval(come, 10000);

MDN上的文档:

delay 是 setInterval() 函数在每次调用 func 之前应该等待的毫秒数(千分之一秒)。与 setTimeout 一样,强制执行最小延迟。

和:

历史上,浏览器实现 setTimeout() “钳制”:延迟小于“最小延迟”限制的连续 setTimeout() 调用被强制使用至少最小延迟。最小延迟 DOM_MIN_TIMEOUT_VALUE 为 4 毫秒(存储在 Firefox 的首选项中:dom.min_timeout_value),DOM_CLAMP_TIMEOUT_NESTING_LEVEL 为 5 毫秒。

于 2012-05-13T23:46:47.187 回答
0

我知道这篇文章很旧,但我需要类似的东西,也许有人需要它。

这是一个没有 setInterval 的版本,基于其他反应(Niet the Dark Absol)的代码。

function timer()
{
    var timer = {
        running: false,
        iv: 5000,
        timeout: false,
        cb : function(){},
        start : function(cb,iv,sd){
            var elm = this;
            clearInterval(this.timeout);
            this.running = true;
            if(cb) this.cb = cb;
            if(iv) this.iv = iv;
            if(sd) elm.execute(elm);
            this.timeout = setTimeout(function(){elm.execute(elm)}, this.iv);
        },
        execute : function(e){
            if(!e.running) return false;
            e.cb();
            e.start();
        },
        stop : function(){
            this.running = false;
        },
        set_interval : function(iv){
            clearInterval(this.timeout);
            this.start(false, iv);
        }
    };
    return timer;
}

用法:

var timer_1 = new timer();
timer_1.start(function(){
    //magic here
}, 2000, false);

var timer_2 = new timer();
timer_2.start(function(){
    //more magic here
}, 3000, true);

//change the interval
timer_2.set_interval(4000);

//stop the timer
timer_1.stop();

如果函数需要在 0 处运行,则 start 函数的最后一个参数是布尔值。

您还可以在此处找到脚本:https ://github.com/Atticweb/smart-interval

于 2015-06-26T09:15:58.360 回答
0

这是mi示例,我认为更简单易懂

const timer = {
  time: 5, // 5 time in seconds
  _time: null,
  _timeout: null,
  fun: () => {},
  start() {
    if (this._timeout == null) {
      const self = this;
      this.fun();
      this._timeout = setTimeout(function repeater() {
        self.fun();
        self._timeout = setTimeout(repeater, 1000 * self.time);
      }, 1000 * this.time);
    }
  },
  stop() {
    const timeout = this._timeout;
    this._timeout = null;
    this.set_time(); // set time to default
    clearTimeout(timeout);
  },
  set_time(time) {
    if (this._time == null) this._time = this.time;

    if (time) {
      this.time = time;
    } else {
      this.time = this._time;
    }
  },
};

解释:

  • time:是每次迭代、循环或下一次调用之间的间隔时间
  • _time : 该变量保存时间的默认值,当使用 stop() 时,该变量(_time) 恢复“时间”
  • start:此函数开始迭代,如果再次调用,它将不会重复。
  • stop : 这个函数,停止超时并设置默认时间和_timeout
  • set_time:该函数设置一个新的时间值,如果不发送参数,时间恢复到默认值,在这个例子中声明运行时为“5”

例子:

const timer = {
      time: 5, // 5 time in seconds
      _time: null,
      _timeout: null,
      fun: () => {},
      start() {
        if (this._timeout == null) {
          const self = this;
          this.fun();
          this._timeout = setTimeout(function repeater() {
            self.fun();
            self._timeout = setTimeout(repeater, 1000 * self.time);
          }, 1000 * this.time);
        }
      },
      stop() {
        const timeout = this._timeout;
        this._timeout = null;
        this.set_time(); // set time to default
        clearTimeout(timeout);
      },
      set_time(time) {
        if (this._time == null) this._time = this.time;
    
        if (time) {
          this.time = time;
        } else {
          this.time = this._time;
        }
      },
    };
    
// print time
timer.fun = () =>{
    console.log(new Date())
};
timer.set_time(10)
timer.start()

于 2020-07-16T05:06:52.763 回答
0

我知道这是一篇旧文章,但我已经实现了一个用于更改运行时间间隔的打字稿版本:

    class LoopTimer {
  private timer: null | NodeJS.Timer;
  private callback: (...args: any[]) => void;
  private ms: number;
  private started: boolean;

  constructor(callback: (...args: any[]) => void, ms: number) {
    this.callback = callback;
    this.ms = ms;
    this.timer = null;
    this.started = false;
  }

  start() {
    if (!this.started) {
      this.timer = setInterval(this.callback, this.ms);
      this.started = true;
    }
  }

  stop() {
    if (this.timer) {
      clearInterval(this.timer);
      this.timer = null;
      this.started = false;
    }
  }

  get getStarted(): boolean {
    return this.started;
  }

  setInterval(ms: number) {
    this.ms = ms;
    if (this.started) {
      this.stop();
      this.start();
    }
  }
}

您可以像这样使用它:当间隔改变时,计时器将停止并重新启动。

    const myTimer = new LoopTimer(()=>{
    console.log("Hello");
}, 100);

myTimer.setInterval(500);
于 2021-05-30T14:03:53.250 回答