30

更新: ドキュメントが正確で最新であるため、この質問は現在古くなっています。

私は jQuery Deferred/Promise API を少し調べてきましたが、哲学的および jQuery ドキュメントの と の違いについて非常に混乱していpipe()ますthen()。jQuery 1.8 の時点で、pipe() は then() の単なるエイリアスであることがわかりました。

jQuery ソースから:

// Keep pipe for back-compat
promise.pipe = promise.then;

しかし、ドキュメンテーションはpipe()then()では完全に異なります。

の説明then():

説明: Deferred オブジェクトが解決または拒否されたときに呼び出されるハンドラーを追加します。

の説明pipe():

説明: Deferred をフィルタリングおよび/またはチェーンするためのユーティリティ メソッド。

歴史的に、それらはわずかに異なる動作をしていたことを理解していますが、pipe のドキュメント全体またはthenのドキュメント全体では、これら 2 つの関数が現在まったく同じことを行うとさえ言っていません。

だから、ここに私の2つの部分からなる質問があります:

  1. jQuery 1.8 の時点でと の間pipe()でドキュメントが異なるのはなぜですか?then()
  2. が新しい遅延オブジェクトthen()を返すのはなぜですか? この動作は完全に文書化されていません (ドキュメントでは、新しいものではなく、Deferred を返すとだけ書かれています)。そうすることには有用性があることを理解しています(つまり、のすべての機能を実装することです)が、哲学的にはなぜそうなのですか?(to attach handlers)の説明を考えると不要です。pipe()then()

アップデート

then()私は、ドキュメントが誤解を招き、不正確であるとさえ言います:

deferred.thenは deferred object を返すため、追加の .then() メソッドを含め、遅延オブジェクトの他のメソッドをこのメソッドにチェーンできます。

漠然としているだけかもしれませんがthen()、実際にはまったく新しいオブジェクトを返すのに、連鎖のために呼び出した遅延オブジェクトを返すことを暗示しています....

再更新

ドキュメントが単に間違っている/古くなっているようです! これが、ドキュメントがそれらが同じものであると言及していない理由の答えです。しかし、私の 2 番目の質問はまだ残っています。その理由は、単純にそれと同等にすることができるように、新しい遅延をthen()返しますか?pipe()

4

1 に答える 1

18

jQuery 1.8 のドキュメントの更新はまだオンラインではありません。

この最近のブログ投稿によると:

1.8 へのすべての変更について API ドキュメントを更新中ですが、現時点では、 jQuery 1.8 アナウンスメントの変更ログを参照して、変更内容を確認できます。

更新:はい、nowと同等であるためthen()、 new を返します。ドキュメントの更新により、これがすぐに明確になると確信しています。Deferredpipe()

完全を期すためのさらなる更新:ドキュメントは最近更新され、現在はpipe()について次のように記載されています。

非推奨の通知: jQuery 1.8 の時点で、このdeferred.pipe()メソッドは非推奨です。それdeferred.then()を置き換えるメソッドを代わりに使用する必要があります。

そしてthen()の場合:

jQuery 1.8 より前では、引数は関数または関数の配列でした。

[...]

jQuery 1.8 の時点で、このdeferred.then()メソッドは、関数を介して deferred のステータスと値をフィルタリングできる新しい promise を返し、非推奨になったdeferred.pipe()メソッドを置き換えます。doneFilterおよび関数は failFilter、元の保留の解決済み/拒否済みのステータスと値をフィルター処理します。このprogressFilter関数は、元の deferrednotifyまたはnotifyWith メソッドへの呼び出しをフィルタリングします。.done()これらのフィルター関数は、Promiseまたはコールバックに渡される新しい値を.fail()返すか、別の監視可能なオブジェクト (Deferred、Promise など) を返し、解決済み/拒否されたステータスと値を Promise のコールバックに渡します。使用するフィルタ関数がnull、または指定されていない場合、promise は元の値と同じ値で解決または拒否されます。

于 2012-08-17T19:25:09.720 に答える