jQuery の Deferred/promise には、解決と拒否の 2 つの結果があります。いずれかの状態に関連付けられているコールバックを Deferred にアタッチできます。添付の条件は、done (解決済みに関連付けられている)、fail (rejected に関連付けられている)、および always (両方の状態に関連付けられている) です。状態が保留から非保留に移行するときのコールバックのシーケンスを決定しようとして失敗しました。つまり、done と always (または fail と always) の場合、resolve と reject の各状態に対してコールバックが実行される順序は何ですか?
5678 次
2 に答える
13
@マルコムの答えは確かに正しいです。ドキュメントでは、次のような多くの場所で言及されています。
deferred.done()およびdeferred.fail()– 「コールバックは、追加された順序で実行されます。」deferred.always()– 「Deferred が解決または拒否されると、コールバックは追加された順序で実行されます」jQuery.ajax()– 「Promise コールバック —.done()、.fail()、.always()、および.then()— は、登録された順序で呼び出されます。」
実装の詳細
Deferred モジュールを見ると、FIFO の「コールバック リスト」を実装するCallbacks モジュールが使用されています。
Deferred オブジェクトにコールバックを追加するためのコール スタックは次のとおりです。
always()done()/fail()Callbacks.add()list.push()– コールバック関数がリストの最後にプッシュされます。
Deferred オブジェクトを解決/拒否するためのコール スタックは次のとおりです。
resolve()/reject()resolveWith()/rejectWith()Callbacks.fireWith()Callbacks.fire()– リスト内のコールバックは、forループを使用して FIFO 順に実行されます。
于 2015-09-20T17:33:16.247 に答える
6
遅延オブジェクトは、コールバックが遅延オブジェクトに追加された順序でコールバックを処理します。done()overに優先順位はありませんalways()。を呼び出しても、を呼び出しても、動作は同じresolved()ですreject()。
次のjsfiddleの例を参照してください。
元の質問に対するコメントは正しくないか、少なくとも完全には正しくありません。
于 2015-06-24T17:29:04.640 に答える