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);
})