jQuery の deferred と promise について読んできましたが、まだ使用していません。
メソッドパイプを除いて、すべてをよく理解しました。私は本当にそれが何であるかを理解していませんでした。
それが何をし、どこで使用できるかを理解するのを手伝ってもらえますか?
これとまったく同じタイトルの質問があることは知っていますが(here)、同じではありません。それを理解するための助けといくつかの例を求めています。他の質問の目的は、特定のケースで機能しない理由を理解することです。
jQuery の deferred と promise について読んできましたが、まだ使用していません。
メソッドパイプを除いて、すべてをよく理解しました。私は本当にそれが何であるかを理解していませんでした。
それが何をし、どこで使用できるかを理解するのを手伝ってもらえますか?
これとまったく同じタイトルの質問があることは知っていますが(here)、同じではありません。それを理解するための助けといくつかの例を求めています。他の質問の目的は、特定のケースで機能しない理由を理解することです。
基本的に、Deferred.pipe()は$ .map()と非同期で同等です。入力として提供された他の値から新しい値を投影しますが、その目的は継続で使用することです。
$.each()
単純なオブジェクトを返すAJAXリクエストのみを要求して発行する例から始めましょう。このオブジェクトのプロパティごとに、id
属性がプロパティのキーであるフォームコントロールで、その値をプロパティの値に設定する必要があります。次のように書くことができます:
$.ajax("your/url", {
dataType: "json"
}).done(function(data) {
$.each(data, function(key, value) {
$("#" + key).val(value);
});
});
ここで、フォームコントロールを更新する前に、値にいくつかの関数を適用するとします。ローカルでそれを行う場合は、次のように書くだけです。
$.ajax("your/url", {
dataType: "json"
}).done(function(data) {
$.each(data, function(key, value) {
// doSomethingWith() projects values synchronously, as map() does.
$("#" + key).val(doSomethingWith(value));
});
});
doSomethingWith()
しかし、クライアント側ではなく、別のWebサービスを介してサーバー側に実装されている場合はどうなりますか?その場合、制御フローを2番目のAJAXリクエストにチェーンし、2番目のリクエストが返されたときにのみフォームコントロールを更新します。Deferred.pipe()
それを簡単にします:
$.ajax("your/url", {
dataType: "json"
}).pipe(function(theOriginalData) {
return $.ajax("your/web/service/doSomethingWith", {
data: theOriginalData,
dataType: "json"
});
}).done(function(theFinalData) {
$.each(theFinalData, function(key, value) {
$("#" + key).val(value);
});
});
OK、ここの別の答えにたくさんの参考資料がありますが、読むことは理解することと同じではない場合があります。
Promiseと、それに.done()を適用するのではなく、.pipe()を適用するのが最も簡単だと思います。それぞれが異なる動作をします。promise.done(function(result){...})を実行すると、その後、.done()または.fail()を呼び出すたびに、さらに.done()または.fail()を追加できます。 )まったく同じpromiseを返します。したがって、各関数は元の約束と、それが解決されるか拒否されるかによって関連付けられます。
ここで、それを.pipe()と対比します。promise.pipe(function(result){...})を使用すると、.pipe()から出力されるのはまったく新しいpromiseです。次に、そのpromiseに.done()または.fail()をアタッチすると、これらの関数は、元の結果ではなく、.pipe()が返す結果の変更されたバージョンを取得します。
したがって、私の経験では、.pipe()が必要になることはめったにありません。それが本当に役立つのは、他のコードがそれを見る前に、promiseから返されたデータを変更する必要がある場合だけです(たとえば、他のクライアント側のコードが機能する前に、クライアント側でAJAX呼び出しの結果を変更するなど)それ)またはあなたが物事をシーケンスする必要がある場合。たとえば、promise Aが解決または拒否した後、別のアクションを実行し、それが実行された場合にのみ、他のコードを最終的にトリガーします。他のすべてのコードは、.pipe()呼び出しからのpromiseBに添付されています。
これは、別のユーザーがpromiseと.pipe()/。done()/。when()の使用に問題があり、jsFiddleでそれぞれの使用を明確にするためのコードを提供しようとした最近の質問です。すべての延期が解決されます
こんにちは、これはあなたが探しているものです:)
[よく読んでください] http://www.bennadel.com/blog/2255-Using-jQuery-s-Pipe-Method-To-Change-Deferred-Resolution.htm
見積もり
pipe() メソッドは、(AJAX 要求の) 成功と失敗の両方の解決にフィルターを提供します。元の解決が成功した場合、pipe() フィルターは真に成功した応答を渡します。または、解決を変更して、新しい拒否された promise を返します。次に、元のリクエストが失敗した場合、これは API では本当に予期しないことであり、pipe() フィルターは正規化された API レスポンス構造を単純に通過します....
例を含むスタックリンク jQuery Deferred.pipe() を理解する
Deferred と Promise を理解していますか? ここを参照してください http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/
Jquery 公式 API ページ http://api.jquery.com/deferred.pipe/ (サンプルあり)
説明: Deferred をフィルタリングおよび/またはチェーンするためのユーティリティ メソッド。
deferred.pipe() メソッドは、関数を介して deferred のステータスと値をフィルタリングする新しい promise を返します。doneFilter および failFilter 関数は、元の保留の解決済み/拒否済みのステータスと値をフィルタリングします。jQuery 1.7 の時点で、このメソッドは、progressFilter 関数を受け入れて、元の遅延オブジェクトの notify または notifyWith メソッドへの呼び出しをフィルタリングします。