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