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