Итак, у меня есть внешний API, который я не могу контролировать. API, используемый для создания некоторого рабочего процесса в другой части программы, для создания этого рабочего процесса пользователь, в данном случае я, должен определить замыкание, что
state
Object. - определяет функцию
entrypoint
, которая вызывает метод, initiate
рабочий процесс, предоставляемый API - , метод
initiate
принимает функцию, скажем func1
в качестве аргумента, здесь фактический рабочий процесс запускается 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) );
}
};
}
Я не знаю наверняка, если это правильный архитектурный подход, даже предложение по другому шаблону приветствуется