私はjQueryDeferred/Promise APIを少し調べてきましたが、哲学的にpipe()
とthen()
の違いとjQueryのドキュメントで非常に混乱しています。 pipe()はjQuery 1.8の時点でthen()の単なるエイリアスであることがわかりました。
JQueryソースから:
_// Keep pipe for back-compat
promise.pipe = promise.then;
_
ただし、pipe()
とthen()
のドキュメントは、用途がまったく異なると思われるため、完全に異なります。
then()
の説明:
説明:Deferredオブジェクトが解決または拒否されたときに呼び出されるハンドラーを追加します。
pipe()
の説明:
説明:遅延をフィルタリングおよび/またはチェーンするためのユーティリティメソッド。
歴史的には動作が少し異なることは理解していますが、 パイプのドキュメント または 当時のドキュメント 全体では、これら2つの関数が機能するとは言えません。今はまったく同じです。
だから、ここに私の2つの部分の質問があります:
pipe()
とthen()
のドキュメントが異なるのはなぜですか?then()
がnew遅延オブジェクトを返すのはなぜですか?この動作は完全に文書化されていません( ドキュメントは、新しいものではなく、Deferredを返すと言っているだけです )。そうすること(つまり、pipe()
のすべての機能を実装すること)に有用性があることは理解していますが、哲学的にはなぜそうなのですか? then()
(ハンドラをアタッチする)の説明があれば不要です。更新
then()
のドキュメントは誤解を招きやすく、不正確であるとさえ言えます。
Deferred.thenは遅延オブジェクトを返すため、追加の.then()メソッドを含め、遅延オブジェクトの他のメソッドをこのオブジェクトにチェーンできます。
あいまいなだけかもしれませんが、実際にはまったく新しいオブジェクトを返すのに、チェーンのためにthen()
を呼び出した遅延オブジェクトを返すことを意味します。
もう一度更新
ドキュメントが単に間違っている/古くなっているようです!それで、ドキュメントがそれらが同じものであると言及していない理由に答えます。しかし、私の2番目の質問はまだ残っています。 then()
がnewを返す理由は、それとpipe()
を同等にするために単純に延期されたのですか?
JQuery 1.8のドキュメントの更新はまだオンラインではありません。
この最近のブログ投稿 によると:
現在、1.8へのすべての変更についてAPIドキュメントを更新していますが、現時点では jQuery 1.8発表 の変更ログを参照して、変更点を確認できます。
更新:はい、then()
は新しいDeferred
を返します。これは 現在はpipe()
と同等です 。ドキュメントの更新により、これがすぐに明らかになると確信しています。
完全性のための更なる更新:ドキュメントは最近更新され、現在 pipe() と表示されています:
非推奨の通知:jQuery 1.8以降、
deferred.pipe()
メソッドは非推奨になりました。代わりにdeferred.then()
メソッドを使用してください。
そして then() の場合:
jQuery 1.8より前は、引数は関数または関数の配列でした。
[...]
jQuery 1.8以降、
deferred.then()
メソッドは、関数を介して遅延オブジェクトのステータスと値をフィルターできる新しいpromiseを返します。廃止予定のdeferred.pipe()
メソッドを置き換えます。doneFilter
およびfailFilter
関数は、元の遅延の解決済み/拒否済みのステータスと値をフィルタリングします。progressFilter
関数は、元の延期されたnotify
またはnotifyWith
メソッドへのすべての呼び出しをフィルタリングします。これらのフィルター関数は、promiseの.done()
または.fail()
コールバックに渡される新しい値を返すか、またはそのオブジェクトを渡す別の監視可能なオブジェクト(Deferred、Promiseなど)を返すことができます。 promiseのコールバックに対するステータスと値を解決/拒否しました。使用されるフィルター関数がnull
であるか、または指定されていない場合、プロミスは元のプロミスと同じ値で解決または拒否されます。