Закрытие фабрики, с внутренними функциями, вызывающими другие внутренние функции - PullRequest
0 голосов
/ 16 февраля 2020

Итак, у меня есть внешний API, который я не могу контролировать. API, используемый для создания некоторого рабочего процесса в другой части программы, для создания этого рабочего процесса пользователь, в данном случае я, должен определить замыкание, что

  1. state Object.
  2. определяет функцию entrypoint, которая вызывает метод, initiate рабочий процесс, предоставляемый API
  3. , метод initiate принимает функцию, скажем func1 в качестве аргумента, здесь фактический рабочий процесс запускается
  4. func1 ожидает некоторого события, затем он обновляет state и возвращает функцию, которая возвращает func2, что является вторым шагом в рабочем процессе, и вы правильно его читаете с двумя возвратами (input: stepInput) => func2(input, state)

, и у меня около 20 таких рабочих процессов, в среднем 5 шагов для одного рабочего процесса и даже параметры , используемые для настройки события, похожи с небольшими изменениями, есть только два варианта событий .

async function Workflow() {
        interface State {
            title: string;
            step: number;
            totalSteps: number;
            result1: string;
            result2: string;
            result3: string;
        }

        async function entrypoint() {
            const state = {} as Partial<State>;
            await initiate(input => step1(input, state));
            return state as State;
        }

        const title = 'workflow title';

        async function step1(input: StepInput, state: Partial<State>) {
            const result1 = await event1({ // options that tweaks the event });


            state.result1 = result1;
            return (input: StepInput) => step2(input, state);
        }
        async function step2(input: StepInput, state: Partial<State>) {
            const result2 = await event1({ // options that tweaks the event });
            state.result2 = result2;
            return (input: StepInput) => step3(input, state);
        }
        async function step3(input: StepInput, state: Partial<State>) {
            const result3 = await event2({ // options that tweaks the event });
            state.result3 = result3;
        }

        state = await entrypoint();
}

Я пытался реализовать фабрику рабочих процессов, у меня кончились идеи, что передать эту фабрику, но я думаю, что это будет выглядеть примерно так

async function WorkflowFactory(
    steps: any[], // still have no clue what this should be
    ) {
    // the workflow 
    return async function() {

        function someFuncion() {
            // probably here the factory magic will happen
        }

        async function entrypoint() {
            const state = { } as Partial<State>;
            await initiate(input => steps[0](input, state) );
        }
    };
}

Я не знаю наверняка, если это правильный архитектурный подход, даже предложение по другому шаблону приветствуется

...