アプリキャストのタイマの持つ致命的な欠点 + その解決策
アプリキャストのタイマ関数は以下のような問題を抱えています。
- コールバックにグローバル関数しか指定できない*1。このためタイマを使うたびに名前空間が汚染され、またクロージャが使えません。
- 同時に3つ以上のタイマを設定できない。多少複雑なプログラムではタイマが3つでは不足しがちです。そうでなくても、「今タイマ何個使ってたっけ?」と意識しながらプログラミングしなければいけないのは、ストレス以外の何ものでもありません。
aclibでは、これらの問題を解消するために独自のタイマ関数を用意しています。
- System.timer.timeout(timeout, callback, thisObject)
- System.timer.interval(interval, callback, thisObject)
それぞれ組み込みのsetTimeout、setIntervalの置き換えとなります。サンプルコードは以下。
// 無名関数OK System.timer.timeout(1000, function() { print('hoge'); }); // クロージャもOK (function () { var msg = 'hello'; System.timer.timeout(1000, function() { print(msg); }); })(); // 3つ以上セットできる for (var i = 0; i < 100; i++) { System.timer.timeout(1000, function() { print('hoge'); }); }
base.js と timer.js を include してお使いください。
*1:グローバル関数以外を指定すると「setting timer with anonymous function is not allowed.」というエラーが出ますが、単に関数に名前をつけるだけではダメで、グローバル関数である必要があるようです