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 に答える