jQuery.Deferredの問題点

(updated 2011-07-11: この記事はjQuery1.5当時のものです。jQuery1.6以上であればpipeメソッドが存在するので、このエントリで懸念している部分については解決します。id:nanto_viさまのコメントも参照のこと) 最近、僕の観測範囲ではjQuery1.5からサポートされたDeferred Objectが話題になってますね。

 ここで書いていたことをちょっと解説。
 リリース時、遂にjQeuryでも遅延処理のサポートが!と僕もちょっと喜んだのですが、それもつかの間、以下の動作を見ていただきたいな、と。
 → http://jsdo.it/ttaiyoh/evYG
 普通、とくにjsDeferred使っていた人間なら、以下のような動作を期待しますよね?
 → http://jsdo.it/ttaiyoh/zI5H
 Deferred Objectのソースみてもらえると分かるのですが、done及びthenメソッドで遅延処理を定義したとしても、$.Deferred#promiseの実行時に、それまでにスタックされていた遅延処理は全て実行されて、スタックが空になってしまいます。それが、最初に見せたDeferred Objectの動作です。
 回避策はなくはなくて、
 → http://jsdo.it/ttaiyoh/19TO
 こんな感じで頑張れば、jsDeferredと同じような遅延をしてくれるようになるのですが、正直なところ、ここまで頑張るくらいなら、素直にjsDeferred使った方がいいな、というのが僕の印象です。$.Deferredは、$.ajaxのレスポンスを受け取るだけ、というくらいに用途を絞った方が、のちのちハマることは少なくなると思います。