JSFiddle - React, Tailwind, and code Playground
by joplomacedo
JavaScript
function addReattempt ( func, timeout = 60000, attemptInterval = 500 ) {
let mainTimeout;
let nextAttemptTimeout;
let attempter;
let attempterReject;
let attempterResolve;
let dbg_attempt_index = 0;
const attempt = () => {
console.log(dbg_attempt_index++);
x=dbg_attempt_index;
return func.call(null, ...arguments).then( () => {
mainTimeout && clearTimeout(mainTimeout);
attempterResolve();
}).catch( () => {
mainTimeout = mainTimeout || setTimeout(() => {
clearTimeout(nextAttemptTimeout);
attempterReject();
}, timeout)
nextAttemptTimeout = setTimeout( () => {
attempt();
}, attemptInterval);
}).then( () => {
attempter = null;
})
}
return {
start() {
attempter = attempter || new Promise( (resolve, reject) => {
attempterReject = reject;
attempterResolve = resolve;
// we could pass in attempterReject and ..Resolve through attempt
// avoiding the need of shared state, but because we need attempterReject
// for the stop() function, we were forced to store a reference to it outside
// and since we were forced to, I chose to keepit consistent and force this
// shared state style
attempt();
}).then( () => {
dbg_attempt_index = 0;
})
return attempter;
},
stop() {
nextAttemptTimeout && clearTimeout(nextAttemptTimeout);
mainTimeout && clearTimeout(mainTimeout);
attempterReject();
attempter = null;
},
}
};
let x = 0;
const a = addReattempt( () => {
return new Promise( (resolve, reject) => {
if ( x > 11 ) {
resolve();
}
...