2013年12月4日水曜日

jQueryDeferredTimeoutUtilities について

お久しぶりです。最近は非同期処理を使うならjQuery.Deferredを使っているjunerです。

で、今回は時前で最近作っている jQueryDeferredTimeoutUtilitiesについてでも解説してみようと思います。

jQueryDeferredTimeoutUtilities(以下、jDTUと略す)はjQueryのDeferredを利用する際に使える時間操作系関数と、jQueryの基本のUtilityをDeferred対応にした関数を合わせた物です。対応jQueryのバージョンは内部でthenを多用する為 1.8 以上としております。本プラグインの現在のバージョンはTest versionと称してまだ0.0.1ではありますが、単体テストはやっていますのでしっかりと動くと思われます。(昨日説明やサンプル・ドキュメントが充実してから1.0をリリースする予定。)

時間操作系関数群について

時間操作系関数は一定時間後に完了(resolve)するDeferredを返す timeout 系と 一定間隔で途中経過を報告(notify)する interval 系の2インターフェース各3種ずつで計6種あります。

これらの関数についてはまぁ読めばわかるとは思いますので割愛します。(詳しくは関数仕様(時間系)を参考にしてください。

で、今回のメインとなるのはjQuery UtilityのDeferred対応を行った方となります。

deferredEach

まずは非同期で要素を走査するdeferredEachです。

通常の場合は setTimeoutなどを通して複雑に書かなくてはいけないところを、この関数を利用することで普通の each文と同様な感じに書くことが出来ます。

この関数は連続して行う必要のある非同期処理を同期的に順番に行う場合に適しています。

ajaxによる取得を行う場合は上記の様になります。

deferredMap

並列に処理を行い、完了時に配列を取得するdeferredMapです。

比較を見ての通り、jQuery.Deferred() に於ける.when() の引数をapplyから配列で渡す様にしてあるだけの物です。

ただし、比較ではwhenのラッパーではありますが、実際は途中キャンセルの為の関数が追加されていたりするのでもうちょっと複雑ではあります。

deferredGrep

grep自体は戻り値に応じて配列の対象部分を含めるか含めないかを選択する関数ではあるのですが、deferredGrepはその戻り値をDeferredも設定出来る様にした物となります。

この関数も .when() のラッパーの1種ではありますが、deferredMapとの大きな違いとしては ajaxが失敗してもcancelされず継続されるということです。

その為、サンプルの様にajaxリクエストを行って問題無い物を配列に纏めて取得したり、失敗した物だけを纏めることが可能となります。

以上。そんな感じとなります。問題点や質問等ありましたらどしどし言って頂けると幸いです。