(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>