19

jQuery の Deferred/promise には、解決と拒否の 2 つの結果があります。いずれかの状態に関連付けられているコールバックを Deferred にアタッチできます。添付の条件は、done (解決済みに関連付けられている)、fail (rejected に関連付けられている)、および always (両方の状態に関連付けられている) です。状態が保留から非保留に移行するときのコールバックのシーケンスを決定しようとして失敗しました。つまり、done と always (または fail と always) の場合、resolve と reject の各状態に対してコールバックが実行される順序は何ですか?

4

2 に答える 2

13

@マルコムの答えは確かに正しいです。ドキュメントでは、次のような多くの場所で言及されています。

  • deferred.done()およびdeferred.fail()「コールバックは、追加された順序で実行されます。」
  • deferred.always()「Deferred が解決または拒否されると、コールバックは追加された順序で実行されます」
  • jQuery.ajax()「Promise コールバック — .done().fail().always()、および.then()— は、登録された順序で呼び出されます。」

実装の詳細

Deferred モジュールを見ると、FIFO の「コールバック リスト」を実装するCallbacks モジュールが使用されています。

Deferred オブジェクトにコールバックを追加するためのコール スタックは次のとおりです。

Deferred オブジェクトを解決/拒否するためのコール スタックは次のとおりです。

于 2015-09-20T17:33:16.247 に答える
6

遅延オブジェクトは、コールバックが遅延オブジェクトに追加された順序でコールバックを処理します。done()overに優先順位はありませんalways()。を呼び出しても、を呼び出しても、動作は同じresolved()ですreject()

次のjsfiddleの例を参照してください。

元の質問に対するコメントは正しくないか、少なくとも完全には正しくありません。

于 2015-06-24T17:29:04.640 に答える