私の仕事は最近少し簡単でした。私はいつも以前に見た単語の約束を思い出したので、辛抱強く勉強するために降りました。
1:約束とは何ですか?なぜこれがそこにあるのですか?
まず第一に、JavaScriptの非同期プログラミング中のコードライティングの問題を解決するためにPromiseが作成されます。
JavaScriptの開発により、ますます非同期シナリオがあります。フロントエンドにはajax、setimeoutなどがあり、バックエンドノードは非同期です。従来の慣行によると、さまざまなコールバックにコールバックを埋め込むことです。コードは人々をめまいにすることができます。
現時点では、CommonJSコミュニティはPromise/A+という仕様を提案しました。これは、非同期コードを整理するためにいつ/その後/解決するなど、非同期コードを作成する方法を定義します。
この仕様は非常にエレガントであるため、ブラウザのネイティブサポートPromise()、jquery、when.jsなどを含む多くの人が次々とこの仕様を実装しています。
これらのライブラリはこの仕様を満たしているため、1つを学ぶだけです。私は主にjQueryの延期を学んだので、この記事では主にこの実装について説明しています。
2:JQuery's Deferred
まず第一に、延期されたオブジェクトについて、Ruan Yifeng氏は記事を詳細に書きました。ここをクリックしてください。最初に彼の記事を読んでから読み続けることをお勧めします。
上記のように、約束は非同期(Ajaxなど)を解決するように設計されているため、それらの違いを比較しましょう。
古典的なjQuery ajaxはと書かれています
コードコピーは次のとおりです。
$ .ajax({
タイプ:「get」、
url: ""、
成功:function(){}、
エラー;関数 () {}
});
成功とエラーのパラメーターは、成功/失敗のときのコールバック関数です。
現在、JQueryのAjax Writingメソッドになりました
コードコピーは次のとおりです。
$ .ajax({
タイプ; "得る"、
URL: ""
})
成功後、doneの関数が呼び出され、故障の関数が呼び出された場合、故障の関数が呼び出されます。
これを見た後、質問があるかもしれませんが、これらのメソッドはどのオブジェクトが行われますか/失敗しますか? $ .ajax()はどのオブジェクトを返し、なぜこれら2つの方法があるのですか?
答えは、以下で紹介する繰延オブジェクトにあります。
jQueryは、新しいタイプの延期を提供します。 $ .deferred()で生成します。例えば
コードコピーは次のとおりです。
var def = $ .deferred();
このdefは、完了/失敗/解決/拒否など、多くの方法を継承します。
したがって、ここでは、上記の$ .ajax()が実際にこのオブジェクトを返すことを知っています。
繰延オブジェクトには多くの方法があります。一般的に使用されるいくつかのものがあります。詳細については、APIを参照してください。
最初のことは、DEFオブジェクトを自然に生成することです。ここには、次のような多くの方法があります。
コードコピーは次のとおりです。
var def = $ .deferred(); //自分で生成します
$ .ajax({}); // AjaxメソッドはDEFオブジェクトも返します
$ .when(); //メソッドがDEFオブジェクトも返す場合
ここで、$ .when()について個別に話し合うことができます。この方法は通常、1つ以上の延期されたオブジェクトを受信し、これらの繰延オブジェクトのステータスに基づいて$ .WHEN()で返されるオブジェクトの状態を決定します。使用シナリオの1つは、複数のAJAX要求です。それらの1つが失敗した場合、それは障害と見なされます。次に、複数のajaxメソッドを$ .when()など、$ .when($。ajax()、$ .ajax())に渡すことができます。次に、$ .WHENがDEFオブジェクトを返します(これら2つのリクエストの結果に基づいて判断)。
次に、DEFオブジェクトを取得し、このオブジェクトの状態を変更する一連の方法があります。
コードコピーは次のとおりです。
def.resolve(); // defオブジェクトを完了するように設定すると、def.done()にバインドされた関数がすぐに実行されます。
def.Reject(); // defオブジェクトを故障したように設定すると、def.fail()にバインドされた関数がすぐに実行されます。
def.notify(); // defオブジェクトの実行中、対応するコールバックはdef.progress()です。
次はコールバックを設定する方法です。順序は上記、つまり、どのような状態がコールバックに呼び出すかに対応します
コードコピーは次のとおりです。
def.done(); // def.resolve()に対応しています。
def.fail(); // def.reject()に対応しています。
def.progress(); // def.notify()に対応しています。
// 特別
def.always(); //成功または失敗した場合に呼び出されます
def.then(); //複数の関数を順番に、成功、失敗、および進捗状況を受け入れる
実際、この時点で、繰延オブジェクトの使用はほとんど同じです。ただし、jQueryはいくつかのAPIを提供します
コードコピーは次のとおりです。
//現在のステータスクラスを確認します
def.isRejected();
def.isResolved();
def.state();
名前が示すように、これらのAPIについては詳細に説明しません。詳細については、上記のjQuery APIドキュメントを確認できます。
別の方法があります。つまり、外部のDEFオブジェクトを提供する場合があり、このオブジェクトはさまざまな状態のコールバックを設定できますが、状態を変更できないため、使用できます。
コードコピーは次のとおりです。
def.promise();
繰延オブジェクトのサブセットであるプロミーオブジェクトを返します。解決/拒否やその他のメソッドなしで、done/failおよびその他の方法を使用できます。主に、DEFオブジェクトの状態が外部から変更されるのを防ぐためです。
この時点で、すべての約束が議論されています。これでプロジェクトで使用できます。さらに、私はあなたに早く幸せな年を願っています。羊の幸せな年をお祈りします^^。