JSFiddle - React, Tailwind, and code Playground

HTML

<script src="https://rawgit.com/kriskowal/q/v1/q.js"></script>

JavaScript

// Call to reset the session (after a method that causes the session ID to change, e.g. get())
var resetSession = function(callback, err, result) {
	var _this = this,
		retries = 0,
		maxRetries = 10,
		done = false,
		success = function() { console.log("success"); if(callback) { callback(err, result); }},
		failure = function() { console.log("tick..."); if(retries++ < maxRetries) { launch(); } else { throw "Timeout waiting for session"; } },
		launch = function() {
			delay(500).then(fetch).then(success).fail(failure).done();
		};
	launch();
};

var myCount = 0;

var delay = function(delay) {
	console.log("Delaying...");
	var defer = Q.defer();
	setTimeout(function() {
		console.log("Tick resolving");
		defer.resolve();
	}, delay);
	return defer.promise;
};

var fetch = function(delay) {
	console.log("Fetching...");
	var defer = Q.defer();
	setTimeout(function() {
		console.log("Fetch resolving");
        if(myCount++ < 5)
            defer.reject();
        else
		    defer.resolve();
	}, delay);
	return defer.promise;
};
resetSession(null);