ugnagブログ

たいした内容はありません。思いつきで書いているだけ。
開発日記がメインかな。

<< 今更ですが、誤解していました | main | 今更ですが2 >>

というわけで、作ってみました

前回の続き。
重い処理はループではなく、ループ内の処理を
毎回setTimeoutで実行させる必要があることが判明。
(いまさらでしたが。。。)


書き方のパターンはあるのだが結構めんどいので、
一般化し、さらにjQueryプラグインの形にしてみた。



せっかくなので、他にも関連機能を付けたプラグインにしてみた。


機能(メソッド)としては、

・非同期ループ処理の実行
・非同期ループのタスクのキュー処理
・タスクオブジェクトのラッパーオブジェクトの作成
・拡張タイムスタンプオブジェクトの管理オブジェクトの作成


となりました。



●非同期ループ処理の実行

 メソッド名:loop

 ループ処理を閉じ込めたオブジェクト(タスクと呼ぶことにします)を引数として実行します。


 タスクオブジェクトは次のフィールドを必要とします。

  ・(数値)intervalTime :
  ・(関数)preProc:ループ開始前に呼び出される
  ・(関数)isContinue(counter):ループを継続するかを返す
  ・(関数)doLoop(counter):ループ処理本体
  ・(関数)endProc(counter):ループ終了後に呼び出される

  isContinue以外は無くてもOKだが、doLoopは定義しないと意味がない。


  使用例:

  $.asyncLoop('loop',
   {
    isContinue:function(ix){
     return ix < 100;
    },

    doLoop:function(ix){
     $('#test1').text(ix);
    },
   });



●非同期ループのタスクのキュー処理

 メソッド名:queue

 キューを管理するオブジェクトを作成する。

 このオブジェクトには、
 ・タスクの追加(実行タスクがなければ、即時実行される)
 ・登録タスク数の取得
 ・全タスクが終了した際に呼び出されるリスナーの追加
 という機能があります。

  使用例:
  var queue = $ayncLoop('queue');

  queue.add(
   {
    isContinue:function(ix){
     return ix < 100;
    },

    doLoop:function(ix){
     $('#test1').text(ix);
    },
   });




●タスクオブジェクトのラッパーオブジェクトの作成

  ラッパーオブジェクトを作成します

  var wrapper = $.asyncLoop('wrapper', task);


●拡張タイムスタンプオブジェクトの管理オブジェクトの作成

 メソッド名:timestamp

  (new Date()).getTime()で取得した時刻に、複数の処理が走る場合に使用します。

  想定しているのは、一瞬のうちに複数のイベントが発生し、
  それらをキューに登録するのだが、その際に登録済みのタスクの実行はキャンセルし、最新のタスクだけ実行させたい、という場合。

 各タスクには、
  ・そのタスクのタイムスタンプ
  ・最新タスクのタイムスタンプへの参照
 を保持させておき、継続判定の時にこれらの情報から実行を継続/中断させる。

  var timestampMgr = $.asyncLoop('timestamp');

  var ts1 = timestampMgr.get();
  var ts2 = timestampMgr.get();

  if(timestampMgr.compare(ts1, ts2) == 0){
   alert('同時刻です');
  }





非同期ループに関しては、欲しい仕様のものが見つからなかったため作ったが、他に関しては、存在自体見つからなかった。

自分が欲しいと思ったので作ったのだが、普通の人はあまり必要としないのかもしれないなぁ。。。
javascript | comments (0) | -

Comments

Comment Form

本文に書いて下さい
本文にh抜きで書いて下さい