Есть цепочка функций:
functionA(
functionB(
functionC(
functionD(
functionE(myVariable)
)
)
)
);
При достижении какого-то условия может понадобиться отказаться, например, от функции functionC в этой цепочке. Для понимания, вот один из вариантов решения:
let trueOrFalse = Math.random() >= 0.5;
if (trueOrFalse) { //если true, то выполняем цепочку с functionC
functionA(functionB(functionC(functionD(functionE(myVariable)))));
}
else { //если false, то выполняем цепочку без functionC
functionA(functionB(functionD(functionE(myVariable))));
}
Вот еще вариант. Тут мы не создаем полностью изолированные цепочки, а возвращаем нужную с нужного места:
let trueOrFalse = Math.random() >= 0.5;
functionA(
functionB(
trueOrFalse ?
functionC( //если true, то выполняем цепочку с functionC
functionD(
functionE(myVariable)
)
)
:
functionD( //если false, то выполняем цепочку без functionC
functionE(myVariable)
)
)
);
Сразу понятен минус всех этих примеров - излишнее дублирование кода. А что, если в цепочке будет гораздо больше функций? Каким образом можно сделать то же, что и в примерах выше, но без дублирования кода? Возможно решение где-то на поверхности, но у меня не получилось его разглядеть.
П.С. не хотел делить вопрос на два разных ввиду схожести, поэтому вот бонус: как без дублирования кода избавиться от метода methodC в цепочке при trueOrFalse === false, но выполнить метод при trueOrFalse === true?
let trueOrFalse = Math.random() >= 0.5;
myVariable.methodA().methodB().methodC().methodD().methodE();
function execChain(funcs, param) {
var res = param;
for(var i = 0; i < funcs.length; i++) {
if (funcs[i])
res = funcs[i](res);
}
return res;
}
execChain([
functionE,
functionD,
trueOrFalse? functionC : null,
functionB,
functionA], 123
);
Для другого вида цепочки - аналогично, только вызывать функции:
res = funcs[i].call(res);
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости