deferred.done(doneCallbacks) adds handlers that run when a Deferred is resolved (success). Available since jQuery 1.5. It returns the Deferred so you can chain more methods.
Remember
dfd.done(fn)
dfd.done(fn1, fn2)
dfd.done([fn1, fn2], fn3)
resolve("ok") → done handlers run with "ok"
reject(...) → done does NOT run
$.get(url).done(fn) // jqXHR success
Create or receive a Deferred/Promise, attach done, then resolve (or wait for AJAX).
Get a Deferred (e.g. $.Deferred()) or a jqXHR from $.ajax / $.get.
Call .done(function (value) { ... }) — pass a function or an array of functions.
When success happens, call resolve(value) (or let AJAX succeed).
Handlers run in order with the resolve arguments; chain fail / always as needed.
Piece
Required?
Role
Deferred / jqXHR
Yes
Object that can resolve
doneCallbacks
Yes
Function or array of functions
Return value
—
Same Deferred (chainable)
Pseudocode
Pseudocode
function done(deferred, callbacks):
queue = flatten(callbacks) // functions and arrays
add each callback to success list
when deferred.resolve(args...):
for each fn in success list (in order):
fn(args...)
return deferred // chainable
Reference
Cheat Sheet
Keep these facts handy while wiring success handlers.
Topic
Detail
Syntax
deferred.done(doneCallbacks [, doneCallbacks ])
Since
jQuery 1.5
Runs when
Deferred is resolved
Arguments
Same values passed to resolve / resolveWith
Multiple handlers
Functions or arrays; order preserved
Late attach
If already resolved → runs immediately
Returns
The Deferred (chainable)
Try it
Live Preview
Pick a scenario and see how done() behaves on resolve.
Browser demo of deferred.done() — same ideas as the examples below.
Result
done: Request successful
Code
jQuery Examples
Short, copy-ready snippets. Open DevTools Console, or use Try It Yourself for a live editor.
Settle first.resolve happens before any handler is attached.
Attach late.done(fn) sees the Deferred is already resolved.
Immediate call. jQuery invokes fn with the stored resolve value.
Why it matters. Modules can attach listeners safely at different times.
Edge Cases & Pitfalls
Check these before relying on done() alone.
path
No reject coverage
done() never runs on failure. Always pair with fail(), catch(), or a rejection branch on then().
chain
done vs then chaining
done() returns the same Deferred. then() returns a new Promise — use then when you need to transform values down a chain.
order
Handler order is fixed
Callbacks run in registration order. Do not assume parallel execution — keep side effects safe to run sequentially.
once
Settled only once
A Deferred resolves or rejects once. Extra resolve calls are ignored; late done handlers still see the first result.
Compatibility
Browser Support
deferred.done() has shipped since jQuery 1.5 and works in all modern browsers with jQuery loaded. It is part of the Deferred Object API (also used by jqXHR).
✓ jQuery 1.5+
deferred.done()
Supported everywhere jQuery Deferred runs in the browser. Use it for success callbacks on Deferred and AJAX objects.
100%Browser support
Google ChromeAll versions · Desktop & Mobile
Full support
Mozilla FirefoxAll versions · Desktop & Mobile
Full support
Apple SafariAll versions · macOS & iOS
Full support
Microsoft EdgeAll versions · Chromium & Legacy
Full support
Internet ExplorerIE 6+ · Legacy environments
Full support
OperaAll modern versions
Full support
done()Excellent
Bottom line: Call dfd.done(fn) for success. Pair with fail() for errors. Works on Deferred and jqXHR since jQuery 1.5.
Analysis
Performance Notes
Approach
Cost
Best for
dfd.done(fn)
O(k) handlers
Success-only side effects
dfd.then(fn)
O(k) + new Promise
Value transforms / chains
dfd.always(fn)
O(k)
Shared cleanup
Handler cost is usually tiny compared with the async work (network, timers). Prefer clear success/error separation over micro-optimizing callback count.
Remember
Key Takeaways
Role: success callbacks when a Deferred resolves.
Multi: pass functions or arrays; order is preserved.
Pair: use fail() / always() for errors and cleanup.
Late attach: already resolved → handler runs immediately.
One line:dfd.done(fn) runs on resolve only — queue success work, and pair with fail() for the error path.
Frequently Asked Questions
done() registers one or more callbacks that run when the Deferred is resolved (success). Handlers receive the values passed to resolve() or resolveWith(), in registration order.
done() runs only on resolve. fail() runs only on reject. Pair them (or use then with two callbacks) so you cover both outcomes.
For success only, similar: then(onFulfilled) also runs on resolve. done() is success-only and does not accept a rejection handler. then() can take both fulfilled and rejected callbacks (jQuery 3+).
Yes. Pass functions or arrays of functions. Callbacks run in the order they were added. You can also chain .done().done().
Yes. If the Deferred is already resolved, new done() handlers fire immediately with the resolved values.
Yes. jqXHR objects support .done(), .fail(), and .always() — the classic jQuery success-handler pattern.