deferred.notify(args) fires progress callbacks while the Deferred is still pending (since jQuery 1.7). It does not resolve or reject — use it for percent done, step labels, or status text.
Remember
dfd.progress(fn)
dfd.notify(25) // fn(25) — still pending
dfd.notify(50) // fn(50)
dfd.resolve("ok") // done handlers; notify stops working
after settle → notify() ignored
While work runs, call notify(args) one or more times.
When finished, resolve or reject — further notify calls are ignored.
Piece
Required?
Role
Deferred
Yes
Must still be pending
args
Optional
Passed to each progress callback
Return value
—
Same Deferred (chainable)
Pseudocode
Pseudocode
function notify(deferred, args...):
if deferred is resolved or rejected:
return deferred // ignore
for each progressCallback (in order):
progressCallback(args...)
return deferred
Reference
Cheat Sheet
Keep these facts handy while wiring progress updates.
Topic
Detail
Syntax
deferred.notify( [args] )
Since
jQuery 1.7
Listener
progress(fn) or then progress filter
State change?
No — stays pending
Multiple calls
Yes, while pending
After settle
Ignored (no throw)
Returns
The Deferred (chainable)
Try it
Live Preview
Pick a scenario and watch notify() feed progress().
Browser demo of deferred.notify() — same ideas as the examples below.
Result
progress: 40%
Code
jQuery Examples
Short, copy-ready snippets. Open DevTools Console, or use Try It Yourself for a live editor.
Resolve first — Deferred leaves the pending state.
Notify after — API ignores it (no error thrown).
Handler never runs for that late update.
Rule: send all progress before settle.
Edge Cases & Pitfalls
Check these before relying on progress updates.
settle
Notify does not finish the job
Always resolve or reject when work ends. Leaving a Deferred pending forever leaks handlers.
order
Progress after settle is dropped
Any notify() after resolve/reject is ignored. New progress handlers added after settle also never fire for past notifies.
api
Not on native Promises
Progress is jQuery-specific. Native Promise has no notify — plan a different progress channel outside jQuery.
access
Expose promise(), not the Deferred
Consumers should listen only. Keep notify / resolve on the private Deferred.
Compatibility
Browser Support
deferred.notify() has shipped since jQuery 1.7 and works in all modern browsers with jQuery loaded. It is part of the Deferred progress API (paired with progress()).
✓ jQuery 1.7+
deferred.notify()
Supported everywhere jQuery Deferred runs in the browser. Use it for interim progress while pending.
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
notify()Excellent
Bottom line: Call dfd.notify(args) while pending. Listen with progress(). After settle, notifies are ignored.
Analysis
Performance Notes
Approach
Cost
Best for
notify occasionally
O(k) handlers
UI percent / steps
Notify every loop tick
Can flood UI
Throttle (e.g. every 5%)
resolve only
O(k)
No interim feedback needed
Progress callbacks are cheap, but updating the DOM on every tiny tick can jank. Throttle notifies to meaningful milestones.
Remember
Key Takeaways
Role: interim progress while the Deferred is pending.
Listen:progress(fn) receives each notify.
Finish: still call resolve or reject.
After settle: further notify() calls are ignored.
One line:dfd.notify(args) updates progress without finishing — pair with progress(), then resolve/reject.
Frequently Asked Questions
notify(args) calls progress callbacks while the Deferred is still pending. It does not finish the Deferred — you still call resolve() or reject() when the work completes.
resolve() settles success and runs done(). notify() only fires progress() (or then progress handlers) and leaves state as pending until resolve or reject.
Register with deferred.progress(fn), or the progress slot of then(). Each notify() passes its args to those callbacks in registration order.
Yes. While pending, you can notify many times (for example 25%, 50%, 75%). After resolve or reject, further notify() calls are ignored.
Usually no. Only the Deferred creator should notify. Give callers a restricted promise via deferred.promise() so they can listen but not change state.
No. Progress is a jQuery Deferred feature. Native Promises only fulfill or reject; use callbacks, events, or other patterns for progress outside jQuery.