JSFiddle - React, Tailwind, and code Playground

by joplomacedo

JavaScript

function createResolver() {
        let resolve;
        let reject;
    
        const promise = new Promise( (_resolve, _reject) => {
            resolve = _resolve;
            reject = _reject;
        })
    
        return {
            promise,
            resolve,
            reject
        }
    }

const orderGroup = {
                'placeEnterOrder': (a) => { console.log('placeEnterOrder', a); return 'placeEnterOrder'},
                'placeManualExitOrder': () => { console.log('placeManualExitOrder'); return 'placeManualExitOrder'},
                'placeStopOrder': () => { console.log('placeStopOrder'); return 'placeStopOrder'},
                'cancelEnterOrder': () => { console.log('cancelEnterOrder'); return 'cancelEnterOrder'},
                'cancelStopOrder': () => { console.log('cancelStopOrder'); return 'cancelStopOrder'},
                'exitAll': () => { console.log('exitAll'); return 'exitAll'},
                'exitPartial': () => { console.log('exitPartial'); return 'exitPartial'},
}

let isInExecution = null;
            let executionQueue = [];

            [
                'placeEnterOrder',
                'placeManualExitOrder',
                'placeStopOrder',
                'cancelEnterOrder',
                'cancelStopOrder',
                'exitAll',
                'exitPartial',
            ].forEach( methodName => {
                const originalMethod = orderGroup[methodName].bind(orderGroup);

                orderGroup[methodName] = function ( ...params ) {

                    const resolver = createResolver();

                    executionQueue.push( () => {
                        Promise.resolve(originalMethod(...params)).then( result => {
                            if ( executionQueue.length ) {
                                executionQueue.shift()();
                                console.log(executionQueue);
                            } else {
                                isInExecution = false;
    ...