What are the differences between Deferred, Promise and Future in JavaScript?

These answers, including the selected answer, are good for introducing promises
conceptually, but lacking in specifics of what exactly the differences are in
the terminology that arises when using libraries implementing them (and there
are important differences).

Since it is still an evolving spec, the answer currently comes from attempting to survey both references (like wikipedia) and implementations (like jQuery):

  • Deferred: Never described in popular references,

    1
    2
    3
    4

    but commonly used by implementations as the arbiter of promise resolution (implementing resolve and reject).

    5
    6
    7

    Sometimes deferreds are also promises (implementing then),

    5
    6

    other times it’s seen as more pure to have the Deferred only
    capable of resolution, and forcing the user to access the promise for
    using then.

    7

  • Promise: The most all-encompasing word for the strategy under discussion.

    A proxy object storing the result of a target function whose
    synchronicity we would like to abstract, plus exposing a then function
    accepting another target function and returning a new promise.

    2

    Example from CommonJS:

    > asyncComputeTheAnswerToEverything()
        .then(addTwo)
        .then(printResult);
    44
    

     

    Always described in popular references, although never specified as to
    whose responsibility resolution falls to.

    1
    2
    3
    4

    Always present in popular implementations, and never given
    resolution abilites.

    5
    6
    7

  • Future: a seemingly deprecated term found in some popular references

    1

    and at least one popular implementation,

    8

    but seemingly being phased out of discussion in preference for the term
    ‘promise’

    3

    and not always mentioned in popular introductions to the topic.

    9

    However, at least one library uses the term generically for abstracting
    synchronicity and error handling, while not providing then functionality.

    10

    It’s unclear if avoiding the term ‘promise’ was intentional, but probably a
    good choice since promises are built around ‘thenables.’

    2

References

  1. Wikipedia on Promises & Futures
  2. Promises/A+ spec
  3. DOM Standard on Promises
  4. DOM Standard Promises Spec WIP
  5. DOJO Toolkit Deferreds
  6. jQuery Deferreds
  7. Q
  8. FutureJS
  9. Functional Javascript section on Promises
  10. Futures in AngularJS Integration Testing

Misc potentially confusing things

Leave a Comment