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 は、func を呼び出すたびに setInterval() 関数が待機するミリ秒数 (1000 分の 1 秒) です。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

この投稿が古いことは知っていますが、似たようなものが必要でした。誰かがそれを必要としているのかもしれません。

これは、他の反応 (Niet the Dark Absol) からのコードに基づいて、setInterval のないバージョンです。

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 で実行する必要がある場合、開始関数の最後のパラメーターはブール値です。

スクリプトはこちらにもあります: https://github.com/Atticweb/smart-interval

于 2015-06-26T09:15:58.360 に答える
0

これは私の例です。よりシンプルで理解しやすいと思います

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 に答える