javascript: setInterval な「class」的なもの

うーん、気付いてなかったわ。

javascript の setInterval なんだけどさ、ほかの言語とかプラットフォームの似た API と違って、コールバック内でタイマー ID を識別出来ないんだね。つまり呼ばれた当人が自殺出来ない。これは弱るなぁ。

ので代替案:

setInterval に delay 以降のパラメータは IE9 以下はサポートされてない
1 function Interval(callback, delay, user_param) {
2     this._timerid = setInterval(callback, delay, user_param);
3     this.clear = function() {
4         clearInterval(this._timerid);
5     };
6 }

このような使い方を想定してる:

1     var timers = {};
2     tk = "Specified key";
3     timers[tk] = new Interval(
4         function(user_param) { // 今の場合 user_param には tk が渡る
5             console.log(user_param);
6             timers[user_param].clear();
7             delete timers[user_param];
8         }, 1000, tk);
9     //timers[tk].clear();

無論「一回呼ばれるだけで自殺」するなら setTimeout を使えばいいのでこれはあくまでも例。普通は何か条件を満たしたら殺すんだろう。

IE9 がダメ…、についてだが…、うーん、「Windows 7 ですら IE11」だよ? 今更気にするの? てことで普通はいいんではないかと思う。ないとは言わないよ、レガシーな基幹系業務が「インターネットから隔離された環境で」延命してるなんてありがちだから。そういう場合は user_param を諦めたバージョンでも「まぁまぁマシ」と思うよ。


追記:
reset もあると嬉しいよね:

 1 function Interval(callback, delay, user_param) {
 2     this._timerid = setInterval(callback, delay, user_param);
 3     this.clear = function() {
 4         if (this._timerid !== null) {
 5             clearInterval(this._timerid);
 6         }
 7         this._timerid = null;
 8     };
 9     this.reset = function(_callback, _delay, _user_param) {
10         this.clear();
11         this._timerid = setInterval(_callback, _delay, _user_param);
12     };
13 }