1

任意のコードを実行し、いつでも停止できるようにしたい。これをsetTimeout使用clearTimeoutして停止できると考えました。ただし、タイムアウトのコードが独自のタイムアウトを作成する場合、元のコードをクリアした後でもそれらは実行され続けます。

例:

var timeoutID = setTimeout(
    function(){
        console.log("first event can be stopped with clearTimout(timeoutID)");
        setTimeout(function(){console.log("but not this one")}, 5000)
    }, 5000)

1 つの方法は、実行中のコードを制御し、追加のタイムアウトの値をグローバル変数に格納して、一度にすべてクリアすることです。しかし、これを行うためのより良い方法はありますか? そして、任意のコードでこれを行う方法はありますか?

明確にするために、関数にタイムアウトが含まれていても、必要な関数を実行し、必要なときにいつでも停止できるようにしようとしています

4

3 に答える 3

0

タイムアウトをオブジェクトにラップするか、2 番目のタイムアウトに timeoutID を再利用できます。

オブジェクトをラップする:

function Timer(){
  var me=this;
  this.currentTimerID=setTimeout(function(){
    console.log("First timeout");
    me.currentTimerID=setTimeout(function(){
      console.log("Second timeout");
    },100);
  },100);
};
Timer.prototype.cancel=function(){
  clearTimeout(this.currentTimerID);
};

var t = new Timer();//let this run it's course
setTimeout(function(){t = new Timer()},250);//start timer again
setTimeout(function(){t.cancel();},400);// cancel it after the first timeout

timeoutID を再利用します。

var timeoutID = setTimeout(
    function(){
        console.log("first event can be stopped with clearTimout(timeoutID)");
        timeoutID=setTimeout(function(){console.log("but not this one")}, 100)
    }, 100)
setTimeout(function(){
  clearTimeout(timeoutID);
},150);// will not execute the second timeout

1 つのヒント: タイムアウトを使用してコードをテストする場合は、元のコードを実行するのに 10 秒かかるため、このような高い値を使用しないでください。

于 2013-08-26T04:24:30.277 に答える