すっかり記事を書くのが遅れてしまいましたが、Kanasan.JS JSDeferred コードリーディングへ行ってきました (参加者ブログ記事一覧)。JSDeferred は cho45 さん作の、非同期処理を簡単に記述するためのライブラリです。簡単なリファレンスもありますが、実際に動かせるサンプルのほうがどんなものか感覚をつかめると思います。
JSDeferred では、ひとつの処理をひとつの Deferred オブジェクトとして表現し、処理の流れは Deferred オブジェクトを順につなげた Deferred チェーンで表します。Deferred オブジェクトは三つのプロパティを持ちます。
callback.ok
プロパティcallback.ng
プロパティ_next
プロパティさらに、Deferred オブジェクトの実行状態を意識すると、JSDeferred を使って書かれたコードが読みやすくなるのではないかと思います。
call
/fail
メソッドが呼び出されると実行中状態へ移る。cancel
メソッドが呼び出されると待機状態へ移る。_next
プロパティ) を自身の継続と同じにする。そうでなければ、自身の継続たる Deferred オブジェクトを実行する (実行中状態へ移す)。new Deferred()
または Deferred()
とすると、待機状態の Deferred オブジェクトが作られる。parallel
関数は飛ばして、先に next
関数、wait
関数を読んだほうがよさそう。next
関数 (Deferred.next
) と next
メソッド (Deferred.prototype.next
) は別物。
next
関数は、実行待ち状態の Deferred オブジェクトを新規作成する。引数に渡された関数がその Deferred オブジェクトの処理本体となる。next
メソッドは、待機状態の Deferred オブジェクトを新規作成し、それを自身の継続とする。引数に渡された関数がその Deferred オブジェクトの処理本体となる。自身の実行状態は変化しない。next
関数については、とりあえず next_default
だけを見れば十分。
next_faster_way_readystatechange
、next_faster_way_Image
は、特定の環境用に高速化を施した版。詳細は「JSDeferred を高速化する (試し中) - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech」を参考に。
next(function f() {
...
return next(function g() {
...
});
}).
next(function h() {
...
});
セコメントをする