ホームページ >ウェブフロントエンド >jsチュートリアル >jQueryのソースコード解析メモ(3) Deferred機構_jquery
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) { ... }) と記述する必要があることがわかります。この成功コールバックはここに記述する必要がありますが、次のように記述できるようになりました: