JSFiddle - React, Tailwind, and code Playground

HTML

<script src="http://cdnjs.cloudflare.com/ajax/libs/q.js/1.0.1/q.js"></script>
<div id="console_log"></div>

JavaScript

var consoleLine = "<p class=\"console-line\"></p>";
 
var console = {
    log: function (text) {
        var d = document.createElement('p');
        d.classList.add('console-line');
        d.textContent = text;
        window.console_log.appendChild(d);
    }
};

function RepeatUntilSuccess(operation, timeout) {
	var deferred = Q.defer();
	operation().then(function success(value) {
		deferred.resolve(value);
	}, function error(reason) {
		Q.delay(timeout).done(function() {
			RepeatUntilSuccess(operation, timeout*2).done(function(value) {
				deferred.resolve(value);
			});
		});
	});
	return deferred.promise;
}

// Example operation

var counter = 3;
function myOperation() {
	var deferred = Q.defer();
	Q.delay(10).then(function() {
		counter -= 1;
		if (counter == 0) {
			console.log("myOperation: OK")
			deferred.resolve(123);
		} else {
			console.log("myOperation: Failed")
			deferred.reject(new Error("not yet"));
		}
	});
	return deferred.promise;
}

RepeatUntilSuccess(myOperation, 500).then(function(value) {
    console.log("Wow, success: " + value);
})