2009-06-15 28 views
12

私の問題は、タイマーを停止できないことです。再帰関数でsettimeoutを停止する

私はこのフォーラムからタイムアウトを設定するのにthis methodでした。 識別子をグローバル変数に格納することになっていました。 偶然、「mydiv」を隠してからまだ実行中であることがわかりました。

再帰関数が複数のインスタンスを作成する場合、またはタイムアウトのインスタンスを1つだけ作成する場合は、これも知っておく必要があります。最初はいつも "var mytimer"を上書きすると思っていたからです。 今私は確信していません。

タイマーを止めるにはどんな方法がありますか?

var updatetimer= function() { 
//do stuff 
     setTimeout(function(){updatetimer();}, 10000); 

}//end function 


//this should start and stop the timer 
$("#mybutton").click(function(e) { 
     e.preventDefault(); 
     if($('#mydiv').is(':visible')){ 
        $('#mydiv').fadeOut('normal'); 
      clearTimeout(updatetimer); 

     }else{ 
        $('#mydiv').fadeIn('normal'); 
        updatetimer(); 
       } 
}); 

おかげで、リチャード

答えて

7

私は 'setTimeoutを' あなたは誤解だと思うと 'てclearTimeout'。

あなたは後でキャンセルするタイマーを設定したい場合は、のような何かをする:あなたはそのタイマーをキャンセルしたい場合は、その後

clearTimeout(foo); 

を呼び出す

foo = setTimeout(function, time); 

希望すると便利です。

+0

私はそれはかなり悪かったと言うだろう - それは機能的ですが、それをキャンセルする方法はありません(setTimeoutの値は取得されないため)、それは毎秒要求を行うのに比べて簡単に固定され、簡単です。それは本当に過剰です、imho。 – annakata

+0

ありがとう、今私は自分のコードをもう理解していない。とにかくそれらの匿名関数を使用する利点は何ですか?答えは広範囲にあるので、他の質問全体である –

+0

のリンクを参照してください:) – annakata

2

mytimerはタイムアウト識別子の値を決して持っていない関数なので、clearTimeout文は何もしません。

私はここに全く再帰を見ませんが、値を保存する必要があります。setTimeoutがあなたを返します。これを複数の潜在的なイベントとペアにする必要がある場合は、ルックアップ - おそらく要素IDのようなもの?

+0

私はあなたが言っていることを理解しています。 –

0

上述したように、このコードは動作していない主な理由は、あなたがclearTimeoutコールに彼間違ったことpassingtだということです - あなたはupdateFunctionにあなたが作るsetTimeout呼び出しの戻り値を格納し、を渡す必要がありますこのを関数参照自体の代わりにclearTimeoutに挿入します。

第2の提案として、再帰的なタイムアウト関数と呼ばれるものがある場合は、キャンセルするまで一定の間隔で関数を実行するsetIntervalメソッドを使用する方がよいでしょう。これは、あなたのupdateFunctionメソッドでやろうとしているのと同じことを実現しますが、遅延関数にdo stuffロジックを含めるだけで済むので、より洗練されています。そして、ネストを作成しないので、閉鎖する。プラスそれは何かを数えなければならない正しい方法ですよね? :-)

+0

http://stackoverflow.com/questions/729921/settimeout-or-setintervalの議論から、setIntervalは常に良いとは限りません。 – billyswong

+0

はい、その議論だけでは、優先メソッドとしてタイムアウトを使用する傾向があるという概念があります。 setintervalは例えば上に戻るためです。私はネストされたクロージャについてはわかりません。多分あなたはそれについて正しいです。 –

20

私はほとんどの人がこれがうまくいかない理由に陥っていると思いますが、私はあなたに最新のコードを提供すると思いました。それはあなたのものとほとんど同じですが、タイムアウトを変数に代入してクリアすることができます。

また、インラインロジックを実行したい場合は、の匿名関数が有効です。関数内でthisの値を変更するか、関数にパラメータを渡します。関数を呼び出すだけであれば、関数の名前を最初のパラメーターとして渡すだけで十分です。

var timer = null; 

var updatetimer = function() { 
    //do stuff 

    // By the way, can just pass in the function name instead of an anonymous 
    // function unless if you want to pass parameters or change the value of 'this' 
    timer = setTimeout(updatetimer, 10000); 
}; 

//this should start and stop the timer 
$("#mybutton").click(function(e) { 
    e.preventDefault(); 
    if($('#mydiv').is(':visible')){ 
     $('#mydiv').fadeOut('normal'); 
     clearTimeout(timer); // Since the timeout is assigned to a variable, we can successfully clear it now 

    } else{ 
     $('#mydiv').fadeIn('normal'); 
     updatetimer(); 
    } 
}); 
0

(関数(){

$('#my_div').css('background-color', 'red'); 
$('#my_div').hover(function(){ 
var id=setTimeout(function() { 
    $('#my_div').css('background-color', 'green'); 
}, 2000); 

var id=setTimeout(function() { 
    $('#my_div').css('background-color', 'blue'); 
}, 4000); 
var id=setTimeout(function() { 
    $('#my_div').css('background-color', 'pink'); 
}, 6000); 

    }) 

$("#my_div").click(function(){ 
     clearTimeout(id); 

     }) 

})();

+1

これはどのようにしてこの質問に答えることができますか? – yhw42

0

あなたはinteadそのののsetIntervalに関数を変換する(同じロジックつまり、あなたの再帰関数を表す)と、それを停止し、作成されるすべての機能を停止することはできません。

// recursive 
var timer= function() { 
// do stuff 
    setTimeout(function(){timer();}, 10000); 
} 

同じロジックをするsetIntervalを使用して:

// same logic executing stuff in 10 seconds loop 
var timer = setInterval(function(){// do stuff}, 10000) 

はそれを停止します。

clearInterval(timer); 
関連する問題