Edit in JSFiddle

(function(jQuery) {
    window.ajaxRetryService = function(ajaxCall, retries) {
        var _deferred = jQuery.Deferred();
        var _tryCounter = 0;
        var _retries = retries - 1;
        var _retryCallback;

        var self = {};

        self.onEachTry = function(retryCallback) {
            _retryCallback = retryCallback;

            return self;
        };

        self.tryIt = function() {
            _tryCounter++;
            _retryCallback(_tryCounter);

            ajaxCall().done(function(results) {
                return _deferred.resolve(results);
            })
            .fail(function() {
                if (_tryCounter <= _retries) {
                    self.tryIt();
                } else {
                    _deferred.reject();
                }
            });

            return _deferred.promise();
        };

        return self;
    };
    
    jQuery('button').click(function() {
        window.ajaxRetryService(function() {return jQuery.get('/echo/json/404');}, 3)
        .onEachTry(function(retryCount) {
            jQuery('div#messages').append('Try number: ' + retryCount + '<br/>');
        })
        .tryIt()
        .done(function() {
            jQuery('div#messages').append('Call succeeded');
        })
        .fail(function() {
            jQuery('div#messages').append('All calls failed');
        });
    });
})(window.jQuery);
<button>Make the call</button>
<div id="messages"></div>