web-dev-qa-db-ja.com

setIntervalハンドラー内でclearIntervalを呼び出しても大丈夫ですか?

N秒ごとに(AJAX呼び出しを介して)条件をチェックするJavascriptがあります。その条件が真の場合、チェックを停止します。次の方法で実装しました。

var stopTimer;
var timerId = setInterval(function() {

    /* Make Ajax Calls and set stopTimer */

    if (stopTimer) {
        clearInterval(timerId);
    }
}, 10000);

しかし、私は不安定な振る舞いを見つけます:時々動作しますが、他の時には、それは永遠にチェックし続けます。私は(可能な限り)コードのどの部分にもエラーがないことを確認しました。

したがって、setIntervalハンドラー内でclearIntervalを呼び出すことが原因である可能性があると思われます。そうですか? setIntervalハンドラー内でclearIntervalを呼び出しても大丈夫ですか?

ご清聴ありがとうございました

38
Ya. Perelman

安全です。問題はおそらく、stopTimerが期待どおりに設定されていないことに関係しています。

19
SpliFF

AJAX関数に誤りがない限り、コードに問題はないと思います。ループが停止しないという問題が発生しないように、AJAX関数の成功とエラーのコールバックに注意する必要があります。

また、サーバーを常にポーリングして応答を確認し、適切なアクションを実行していると思います。 Reverse AJAXを使用して、この種のプロセスを実行できます。

3
rahul

コード内の他の場所で同じタイマー名を誤って再使用しないようにしてください。これにより、定義する2番目のタイマーが常に停止します。

タイマーに一意の名前を付けるか、関数のスコープを設定します

var timerForAjax = setInterval(function() {

    /* Make Ajax Calls and set stopTimer */

    if (stopTimer) 
    {
        clearInterval(timerForAjax);
    }
}, 10000);

タイマーをintervalと呼ぶのに不注意でしたが、同じスコープで両方ともintervalと呼ばれる2つのタイマーを作成していることに気づきませんでした。 that はそれとは何の関係もないことに気付くまで、iOS8を約1時間非難しました。

2
Simon_Weaver