【Javascript】setTitervalでやらかした話

Javascriptのプログラムで、常に特定の変数を監視する処理をsetInterval()を使用して実装した際の話。

本当はsetInterval()を使用すべきでないのも、Reactを使用すればStateで自動で処理してくれるのもわかってはいるのですが、今回はもろもろの都合でこの方法をとることにしました。

さて、最初僕は下記のように記述していました。

setInterval(loadingIconSwitcher(), 100);

function loadingIconSwitcher() {
            if (!ajax_status || !prev_photo_ajax_status || !upload_status) { //条件の変数はすべてboolの値が入る
                $("#loading").css("display", "block");
            } else {
                $("#loading").css("display", "none");
            }
        }

3つの変数のうち、いずれかでもfalseになれば読み込み中のloadingアイコンを表示し、すべてtrueになったら消す、というプログラムをsetIntervalで100ミリ秒ごとに回して疑似的に変数を監視するのが目的です。

もうお分かりの方もいるかと思いますが、上記のコード、正常に動作しません。

実際に動かしたところ、なぜか一度だけ”loadingIconSwitcher()”が動いて止まるだけです。

最初、なぜループされないのか全く分からずいろいろ調べたところ、こちらの記事を発見。

setInterval()の盲点::JavaScript – カニとモモンガと愉快なユウ

この記事を見て思い出しましたが、このsetInterval()という関数で、第一引数に指定する関数を”文字列”で渡さないといけないことになっています。

つまり、上記の例だと

setInterval("loadingIconSwitcher()", 100);

とするのが正解です。

こちらに直したところ、意図した通り100ミリ秒ごとに動いてくれるようになりました。

しかし関数名をなぜ文字列で渡すのか…正直納得がいきませんが…

ということで、setInterval()関数を使う方はご注意ください。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG