20

jQuery's Deferred/promise has two outcomes: resolved and rejected. You can attach callbacks to the Deferred which are associated with either state. The conditions for attachment are done (associated with resolved), fail (associated with rejected), and always (associated with both states). I have unsuccessfully been trying to determine the sequence of the callbacks when the state moves from pending to non-pending; i.e., for done and always (or fail and always), what is the sequence in which the callbacks execute for each state of resolved and rejected?

4
  • I'm pretty sure it's not defined. It shouldn't really be defined and you should never need to rely on it. Commented May 1, 2013 at 3:04
  • 4
    It's very defined. First, either fail or done will be called. Next, always will be called. It can't be in any other order. The callbacks will trigger fifo Commented May 1, 2013 at 3:04
  • 7
    FIFO rules: DEMO. Commented May 2, 2013 at 12:23
  • 3
    As @Beetroot-Beetroot's demo makes clear, it is entirely fifo and not as Kevin-B suggests that done/fail precedes always. Someone should make Beetroot-Beetroot's comment the answer - it appears to be correct and definitive. Commented Apr 30, 2014 at 9:10

2 Answers 2

14

@Malcolm's answer is indeed correct. The docs mention it in many places, including:

  • deferred.done() and deferred.fail()"Callbacks are executed in the order they were added."
  • deferred.always()"When the Deferred is resolved or rejected, callbacks are executed in the order they were added"
  • jQuery.ajax()"Promise callbacks — .done(), .fail(), .always(), and .then() — are invoked, in the order they are registered."

Implementation details

Looking at the Deferred module, it uses the Callbacks module which implements a FIFO "callback list".

Here's the call stack for adding callbacks to a Deferred object:

And here's the call stack for resolving/rejecting the Deferred object:

Sign up to request clarification or add additional context in comments.

Comments

6

Deferred objects process their callbacks in the order that the callback was added to the deferred object. There is no precedence to done() over always(), or vice versa. The behavior is identical whether you call resolved() or reject().

Please see the following jsfiddle example.

The comments on the original question are not correct, or at least not completely correct.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.