えちょ記

語らないブログ

jQuery Deferred Object

すべての関係を簡潔にまとめている記事が見つからなかったので作ってみた‥‥つもりだったが、画像小さいのねん‥‥;;

f:id:dot_station:20120801125404p:plain

なるべく少ない言葉で説明してみる。

 

Deferred(繰延) Object、超訳すると「結果が出たあとの行動(callback)を約束する仕組み」。

 

f:id:dot_station:20120801213618p:plain

Deferredは3つの状態を持つ。最初は保留状態、そして解決か、失敗の状態のいずれかに遷移する。resolve()メソッドの呼び出しでresolved、reject()メソッドの呼び出しでrejectedになる。結果が出たら他の状態には切り替わらない、切り替えは1回のみ。

 

f:id:dot_station:20120801213617p:plain

結果が出たらDeferredは予め登録された約束を実行する。約束はcallbackを登録する各メソッド。成功した時にdone()の約束、失敗した時に.fail()の約束を果たす。.always()の約束はどっちの結果になっても、結果が出たら果たされる。

 

.notify()と.progress()の関係は少し特殊。この遷移と約束は、「結果が出るまでの間」状態にかかわらず果たされ続ける。.notify()が1回通知されるたびに、.progress()の約束が1回果たされる。実行中の状態通知用。

 

.then()は便利な約束メソッド。3種類、.done()、.fail()、.progress()の約束を一度にできる。

 

なお、すでに結果が出てるDeferredに約束を追加したらどうなるか?確認してみて欲しいが、理想的に実装されているなら約束した瞬間に、約束は果たされるだろう。

 

以上。