19

jQuery の deferred と promise について読んできましたが、まだ使用していません。

メソッドパイプを除いて、すべてをよく理解しました。私は本当にそれが何であるかを理解していませんでした。

それが何をし、どこで使用できるかを理解するのを手伝ってもらえますか?

これとまったく同じタイトルの質問があることは知っていますが(here)、同じではありません。それを理解するための助けといくつかの例を求めています。他の質問の目的は、特定のケースで機能しない理由を理解することです。

4

3 に答える 3

47

基本的に、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);
    });
});
于 2012-04-20T21:19:21.540 に答える
11

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でそれぞれの使用を明確にするためのコードを提供しようとした最近の質問です。すべての延期が解決されます

于 2012-04-20T21:19:49.377 に答える
1

こんにちは、これはあなたが探しているものです:)

[よく読んでください] 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 メソッドへの呼び出しをフィルタリングします。

于 2012-04-20T20:43:08.377 に答える