clearInterval()はsetInterval()内で呼び出すことができますか?


124
bigloop=setInterval(function () {
              var checked = $('#status_table tr [id^="monitor_"]:checked');
                if (checked.index()===-1 ||checked.length===0 || ){
                    bigloop=clearInterval(bigloop);
                    $('#monitor').button('enable');
                }else{

                        (function loop(i) {                           
                            //monitor element at index i
                            monitoring($(checked[i]).parents('tr'));
                            //delay of 3 seconds
                            setTimeout(function () {
                                //when incremented i is less than the number of rows, call loop for next index
                                if (++i < checked.length) loop(i);
                            }, 3000);
                        }(0)); //start with 0
                }                            
            }, index*3000); //loop period

上記のコードを使用していますが、機能している場合と機能していない場合があります。clearIntervalが実際にタイマーをクリアするかどうか疑問に思っていますか機能しmonitorているときにのみ無効になるこのボタンがあるからmonitoringです。clearInterval呼び出された要素.outputRemoveがクリックされたときに別のものがあります。以下のコードを参照してください。

//remove row entry in the table      
        $('#status_table').on('click', '.outputRemove', function () {
            deleted= true;
            bigloop= window.clearInterval(bigloop);
            var thistr=$(this).closest('tr');
            thistr.remove();
            $('#monitor').button('enable');

            $('#status_table tbody tr').find('td:first').text(function(index){
               return ++index;

            });
        });

しかし、それは再び無効になる前にしばらく有効にされました。ウィルclearIntervalからプログラムを出すsetInterval機能?


多分問題はloopname2番目のスニペットにありますか?それは何ですか?
bfavaretto 2013年

opps typo。clearloop(loopname)を含む関数がありましたclearIntervalが、簡単にするために、上のコードで直接変更しました。
yvonnezoe 2013年

回答:


212

はい、できます。あなたもそれをテストすることができます:

var i = 0;
var timer = setInterval(function() {
  console.log(++i);
  if (i === 5) clearInterval(timer);
  console.log('post-interval'); //this will still run after clearing
}, 200);

この例では、このタイマーiは5 に達するとクリアされます。


4
そうですか。それは常にローカル変数でなければなりませんか?私の場合、clearIntervalを呼び出す外部関数があるため、グローバルに設定します...また、現時点では2つのsetIntervalがあり、それらは衝突しています:/
yvonnezoe

私はここに質問があります、それがどこか他の場所で停止したかclearIntervalsetIntervalまったく開始しなかった時点で動かなくなりますか?
yvonnezoe 2013年

@yvonnezoeが答えを更新しましたが、それは違います。間隔ごとに実行される関数は、再度実行される前に終了します。ただし、質問の場合は、複数のタイマーがあります。あなたのアプローチを再考することをお勧めします。
ジョセフ

わかりましたありがとうございます :)それからそれは私のプログラムのいくつかの論理エラーでなければなりません。
yvonnezoe 2013年

1
このアプローチが機能するという事実は、私の心を揺さぶります。変数定義自体で変数を参照しています。「タイマー」とは何かをまだ定義していて、それをclearIntervalの引数として呼び出す場合、これはどのように機能しますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.