Skip to content

jQuery Callback

Callback functions ensure that a piece of code runs only after another asynchronous operation (like an animation or an AJAX request) has completed.

JavaScript executes code line by line. However, many jQuery operations, especially effects (like hide(), fadeIn()) and AJAX requests, are asynchronous. This means they start an operation but don’t wait for it to finish before moving to the next line of code.

Consider this code:

$("p").hide(1000); // Start hiding over 1 second
alert("The paragraph is now hidden... or is it?"); // This runs immediately!

The alert will appear before the paragraph has fully hidden because hide(1000) initiates the animation but doesn’t block execution.

To execute code after the effect is complete, you provide a callback function.

$(selector).effectName(speed, callback);

Where callback is a function that gets executed once the effectName animation is 100% finished.

Example with Callback:

$(function() {
$("button").on('click', function() {
$("p. MuiDialog-paper").hide('slow', function() {
// This function is the callback
alert("The test paragraph is now completely hidden.");
});
});
});

In this example, the alert only appears after the paragraph with class=" MuiDialog-paper" has finished its ‘slow’ hide animation.

Example without Callback (Incorrect Timing):

$(function() {
$("button").on('click', function() {
$("p. MuiDialog-paper").hide(1000); // Start hiding
// This alert runs immediately, before the hide animation finishes
alert("The paragraph hiding has started, but isn't finished yet!");
});
});

While callbacks are common for jQuery effects, modern JavaScript and newer jQuery versions heavily favor Promises for handling asynchronous operations like AJAX ($.get, $.post, $.ajax).

Promises provide a more flexible and readable way to manage asynchronous success and failure states using methods like .done(), .fail(), and .always() (or .then() and .catch()).

Example using Promises with $.get:

$(function() {
$("button#load-data").on('click', function() {
$.get('api/data.json')
.done(function(data) {
// This runs if the request succeeds
console.log("Data loaded successfully:", data);
$("#content").text(JSON.stringify(data));
})
.fail(function(xhr, status, error) {
// This runs if the request fails
console.error("Failed to load data. Status:", status, "Error:", error);
$("#content").text("Error loading data.");
})
.always(function() {
// This runs regardless of success or failure
console.log("AJAX request finished.");
});
});
});

While you can still pass callbacks directly to methods like $.get, using the Promise interface (.done(), .fail()) is generally considered better practice for AJAX in modern jQuery.