『 一定時間後に関数を一度だけ実行するDelayExecutorクラス 』

2009 年 7 月 26 日

DelayExecutorクラス
Timerは手続きが多くて面倒、setTimeoutは何故かしっくりこない人のための、一定時間後に指定した関数を一度だけ実行するクラスです。いわゆる遅延処理。

» DelayExecutor.as (拡張子をasに変更してください)

以下の例は、全て3秒後にtrace(“完了!”)を実行します。
 
(1) new DelayExecutor()でインスタンスを生成して実行する

var exe:DelayExecutor = new DelayExecutor(func, 3000);
exe.start();

function func(executor:DelayExecutor):void {
  trace("完了!");
}

 
(2) インスタンスを生成後に、コールバック関数と遅延時間を設定して実行する

var exe:DelayExecutor = new DelayExecutor();
exe.onComplete = func;
exe.delay = 3000;
exe.start();

function func(executor:DelayExecutor):void {
  trace("完了!");
}

 
(3) インスタンス生成から実行までを、static関数を使って1行で繋げる

DelayExecutor.register(func, 3000).start();

function func(executor:DelayExecutor):void {
  trace("完了!");
}

 
(4) 無名関数を使った、さらなる省略形

DelayExecutor.register(function(executor:DelayExecutor):void {
  trace("完了!");
}, 3000).start();

内部的にaddEventListenerしたものは、タイマー完了時に全てremoveEventListenerしています。

また autoClear = true; とすれば、タイマー完了時に onComplete = null; が実行されます。上記のように、タイマーを再利用しない場合には autoClear = true; とすることをお勧めします。autoClearはコンストラクタやregisterの第3引数でも設定可能であり、デフォルトでtrueです。

ただし、あらかじめ autoClear = false; としておけば以前設定したonCompleteを再設定せずにタイマーを再実行することができます。次の例のように無名関数と組み合わせる場合に有効かも知れません。次の例では autoClear = false; とした上で遅延時間を3秒後、5秒後、7秒後・・・と増やしながら無名関数を実行していきます。
 
(5) autoClear = false で実行関数を再設定せずにタイマーを再利用する

DelayExecutor.register(function(executor:DelayExecutor):void {
  trace("完了!");
  executor.delay += 2000;
  executor.start();
}, 3000, false).start();

autoClear = false; とする場合、またはstop()でタイマーを停止した状態でタイマーが不要になったときには、必ず手動で onComplete = null; としてください。(メモリリークの原因となることがあります。)
 
register()、start()、stop()メソッドは戻り値としてDelayExecutorインスタンスを返すので、タイマーのキャンセルや再利用などに使ってください。

例によって、今回使ったソースファイル一式を置いておきます。
» Download

« 
» 

One Response to “一定時間後に関数を一度だけ実行するDelayExecutorクラス”

  1. 1 AS3でn秒後に1度だけ実行 | Code Life
    11月 27th, 2011 at 3:10 AM

    [...] 紹介するのは以下のサイトのクラスです。 『 一定時間後に関数を一度だけ実行するDelayExecutorクラス 』 [...]

Leave a Reply