Initially, jQuery asynchronous functions weren't returning promises, you had to use the callback.
Then they added the deferred (promise) system but kept the callbacks for compatibility (and because not everybody like deferred).
From the Deferred object documentation :
In JavaScript it is common to invoke functions that optionally accept
callbacks that are called within that function. For example, in
versions prior to jQuery 1.5, asynchronous processes such as
jQuery.ajax() accept callbacks to be invoked some time in the
near-future upon success, error, and completion of the ajax request.
jQuery.Deferred() introduces several enhancements to the way callbacks
are managed and invoked. In particular, jQuery.Deferred() provides
flexible ways to provide multiple callbacks, and these callbacks can
be invoked regardless of whether the original callback dispatch has
already occurred. jQuery Deferred is based on the CommonJS Promises/A
design.