JSFiddle - React, Tailwind, and code Playground

by joplomacedo

JavaScript

function createQaInstance() {
    let currentProcess = null;
    const queue = [];

    function process( {id = null, f}) {

        const processDetails = {
            id,
            f,
            cancelled: false
        }

        if ( currentProcess ) {

            if ( id !== null ) {
                if (currentProcess.id === id ) {
                    currentProcess.cancelled = true;
                } else {

                    const idx = queue.findIndex( item => item.id === id);
                    
                    if ( idx !== -1 ) {
                        queue.splice(idx,1);
                    }
                    
                }
            }

            queue.push(processDetails)

            return;
        }

        currentProcess = processDetails;

        f({
            next( f ) {
                if ( currentProcess.cancelled ) {
                    currentProcess = null;
                    queue.length && process(queue.shift())
                } else {
                    f();
                }
            },
            complete() {
                currentProcess = null;
                queue.length && process(queue.shift())
            }
        })
    };


    return function ( processId ) {
        return f => {
            return process({id: processId, f});
        };
    }
  }









const qa = createQaInstance();

qa('main')(({next, complete}) => {
	console.log('exec1: 1.a')
  
  setTimeout(() => {
  	
    next(()  => {
    	console.log('exec1: 1.b');
      
      setTimeout(complete, 3000)
    })
  
  }, 3000)
})


qa()( ({complete}) => {
	console.log('2')
  setTimeout(complete, 3000)
})


qa('main')( ({next, complete}) => {
	console.log('exec2: 1.a')
  
  setTimeout(() => {
  	
    next(()  => {
    	console.log('exec2: 1.b');
      
      setTimeout(complete, 3000)
    })
  
  }, 3000)
})