「javascript△clearinterval△」と検索窓に打ち込んで思ったこと

やりかけのことがあって、なんかハマちゃってて抜け出せないんで寄り道。

「知らなくて調べた」わけではなく、「タイマーは setInterval だったよな、確か」「殺すのはなんだっけ、…javascript△clear、あ、clearInterval か」てな具合。後者でどういうわけだか「効かない」が suggestion として候補にあがる。

何箇所かみたんだけれども、「効かないことにハマった人がほかにもいるようだ」「setInterval したもの全部クリアすればよい」で話を終えてる。

正直「なんぢゃそりゃぁ」と思った。ほかにも考えることあんじゃないの、とか、「当たり前じゃないか」とか。こんなもん「javascript」関係ない。

ボタンやら hover がトリガーになってタイマー起動するんなら二度目の起動をしないように disabled にするとかさ、普通に考えるんじゃないのかね。とか。

あとね、皆「タイマーつぅたら一定時間間隔で繰り返すもんだ」と思い込みがちなんだけれども、その考え方もちょっと捨ててみるといい。setInterval もそうだけれども、「タイマー的なことを提供出来る API」のほとんど全ては、「一定時間で指定処理を繰り返す、もしくは指定時間後に指定処理を呼び出す」の両方のニーズに耐えられるように必ず作られてる(というか一方があれば他方は必ず実現出来る)。

後者のような使い方をワタシは「ワンショットタイマー」と呼ぶのを好むが、まぁ呼び名はなんでもいい。そして後者は「setInterval 前に必ず clearInterval する」とか、setInterval で呼び出されるコールバック内で clearInterval するとかそんなやり方でやったりする。あるいは「一定時間間隔で」ではなく「可変時間間隔で」を実現するのにも、「setInterval で呼び出されるコールバック内で clearInterval/setInterval し直す」でいい。…みたいな発想を日常からしてるとだな、「setInterval を何度も呼び出すと clearInterval が一回分にしか効かないので止まりません! 注意です!」みたいな注意(情報)って、なんだかなぁ、としか思えない。

「ワンショットタイマー」の使い方でワタシが好きなのは「タイムアウトの代わりに使う」使い方。発想はこう:

  1. 何かイベント発火したらワンショットタイマー起動
  2. 連続で立て続けに同じイベント発火したら前のタイマー殺しつつ再びワンショットタイマー起動
  3. …以下同文…
  4. 発火が「落ち着いた」らめでたく最後に生きていたワンショットタイマーのコールバック起動

猛烈な勢いでやってくる何かイベントの最後のものだけ採用すればいい場合に使う。たとえばフォルダの監視なんかしてるとする。この場合に大量ファイルが追加や削除された一つ一つのイベントにいちいち反応してたら埒が明かない。忙しいイベントが落ち着いてからじっくり反応すればいいのだ。(確か kivyLauncher ネタのどれかで使ってた気がすんだけど覚えてない。かなり日常なので。)

なんつーのかな、この手の発想を普段からしてる場合は「setTimer(的な何か)/killTimer(的な何か)」は必ず対で考えるんだよね。「setInterval を何度も呼び出すと clearInterval が一回分にしか効かないので止まりません! 注意です!」的思考で止まる人たちは、脳内でこれらがペアになってないんだと思う。