jQueryのソースコード解析メモ(3) Deferred機構_jquery

WBOY
リリース: 2016-05-16 18:05:55
オリジナル
927 人が閲覧しました

Deferred はコールバック関数をキューに登録し、それらを均一に管理し、これらの関数を同期または非同期で呼び出すことができます。
jQuery.Deferred() は Deferred オブジェクトを構築するために使用されます。このオブジェクトには状態値があり、拒否、解決、初期状態の 3 つのタイプがあります。 「解決済み」は操作が正常に完了したことを意味し、「拒否」はエラーが発生して通話が失敗したことを意味します。 Deferred オブジェクトの主なメンバーは次のとおりです:
done(callback): ステータスが解決されたときに呼び出されるコールバック関数を登録します。 *fail(callback): ステータスが拒否されたときに呼び出されるコールバック関数を登録します。 * always(callback): 解決されるか拒否されるかに関係なく呼び出されるコールバック関数を登録します。 * then(successCallback, FailureCallback): 成功と失敗のコールバック関数を同時に渡します。 * Pipe(successFilter, FailureFilter): 成功および失敗のコールバック関数を呼び出す前に、pipe で指定された関数を呼び出します。関数呼び出しをインターセプトするパイプライン機構とみなされます。 *solve(args): ステータスを解決済みに設定します。 *拒否(引数): ステータスを拒否に設定します。 *promise(): 解決と拒否を行わずに不完全な Deferred インターフェイスを返します。つまり、Deferred オブジェクトの状態は変更できません。読み取り専用ビューとして考えることができます。これは、外部関数が早期にコールバック関数をトリガーするのを防ぐためです。たとえば、$.ajax はバージョン 1.5 以降、XMLHttpRequest を返さなくなり、代わりに XMLHttpRequest および Deferred オブジェクト インターフェイスをカプセル化したオブジェクトを返します。 Deferred 部分は、promise() によって取得されます。これにより、外部関数がsolve および拒否を呼び出すことがなくなり、ajax が完了する前にコールバック関数がトリガーされることがなくなります。これら 2 つの関数の呼び出し権限を内部的に ajax に予約します。
このモジュールのコードは、jQuery オブジェクトの宣言の直後の行 939 から始まります。基本的なコアコードとみなすこともできます。これはバージョン 1.5 の最大の変更点の 1 つでもあります。
実際、Resolve と Reject のコード ロジックは同じですが、対応する状態は異なります。コードを再利用する場合、最初に Deferred が内部で実装され、次に 2 つの Deferred が実際の Deferred 内に新しく追加され、1 つは Resolve として、もう 1 つは Reject として使用されます。
_Deferred オブジェクトは内部的に関数配列 (コールバック リスト) を保持します。 Done(f1, f2...) の仕事は、これらのコールバックをこのキューに順番にプッシュし、保存することです。そして、resolveWith(パラメータで解決)とsolveでこのコールバック関数を順番に呼び出します。
Done では、イベントが完了したかどうかを判断する必要があります。コールバックがチェーンに追加されたときにイベントが完了している場合は、コールバックをすぐに実行する必要があります。この機能により、非同期イベントをトリガーする宣言と一緒にコールバックを記述する必要がなくなりました。たとえば、$.post("...", function(data) { ... }) と記述する必要があることがわかります。この成功コールバックはここに記述する必要がありますが、次のように記述できるようになりました:

コードをコピー コードは次のとおりです:

var defer = $.post("...");
// ...
defer.success(function(data) {
// ...
});
// ...
defer.fail(function(data) {
// ...
});

などの非同期イベント宣言とコールバック関数は別々に管理できます。これはバージョン 1.5 での書き換え後の最大の変更点です。
pipe(successFilter, FailureFilter) 関数は、元のオブジェクトのコールバック リストを変更します。フィルター関数は、then 関数を使用して 2 つのコールバック リストの前に挿入されます。それから戻ります。このように、この Deferred オブジェクトの状態が変化すると、パイプ関数で指定された Filter 関数が最初に呼び出され、次にコールバック リストが呼び出されます。
promise() ははるかに単純で、新しいオブジェクトを作成し、そこに必要なメンバーをコピーするだけです。必要なメンバーは、promiseMethods という定数で定義されます。
コードをコピー コードは次のとおりです:

var PromiseMethods = "done failed isResolved isRejected Promiseその場合は常にパイプ ".split(" ");
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート