jQuery - jQuery Deferred / Promises
What are Deferred / Promises in jQuery?
When you make an asynchronous operation (like an AJAX request or animation), the result isn’t available immediately.
-
Deferred objects let you manage these results.
-
They return a promise, which allows you to attach callbacks for success, failure, or completion.
This makes your code more organized and readable compared to nesting multiple callbacks.
Key Methods
1. .done()
-
Runs when the operation succeeds.
$.ajax("data.json")
.done(function(data) {
console.log("Success:", data);
});
2. .fail()
-
Runs when the operation fails (like server error, wrong URL).
$.ajax("wrong.json")
.fail(function(error) {
console.log("Error occurred:", error.statusText);
});
3. .always()
-
Runs no matter what (success or failure).
$.ajax("data.json")
.always(function() {
console.log("AJAX call finished.");
});
Chaining Example
$.ajax("data.json")
.done(function(data) {
console.log("Data loaded:", data);
})
.fail(function() {
console.log("Request failed!");
})
.always(function() {
console.log("Request completed (success or fail).");
});
Custom Deferred Example
You can also create your own deferred objects:
function asyncTask() {
var deferred = $.Deferred();
setTimeout(function() {
var success = true;
if(success) {
deferred.resolve("Task completed!");
} else {
deferred.reject("Task failed!");
}
}, 2000);
return deferred.promise();
}
asyncTask()
.done(function(msg) { console.log(msg); })
.fail(function(err) { console.log(err); })
.always(function() { console.log("Task finished."); });
Simplified Explanation
-
.done()
→ runs when things go right -
.fail()
→ runs when things go wrong -
.always()
→ runs at the end, regardless of success or failure