Быстрое избавление от функции в цепочке функций

250
13 декабря 2021, 01:00

Есть цепочка функций:

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();
Answer 1

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);
READ ALSO
как в методе отображать ИЗМЕНЕННЫЙ параметр

как в методе отображать ИЗМЕНЕННЫЙ параметр

как в методе myItem (showmyItem) отображать ИЗМЕНЕННЫЙ параметр this

155
Как сделать, чтобы снимался чекбокс?

Как сделать, чтобы снимался чекбокс?

Способ может показаться костыльным, вместо описанного используют радио-кнопки, но так требует ситуацияКак сделать, чтобы снимался чекбокс,...

144
Проблема с эмуляцией клика по кнопке Selenium, JS, Python, Chrome

Проблема с эмуляцией клика по кнопке Selenium, JS, Python, Chrome

Задача сэмулировать клик по кнопке «Проверено» на хитром UXbutton “Проверено» имеет свойство срабатывать при клике правой кнопкой мыши, как...

66
Как анимировать SVG с помощью ванильного JS?

Как анимировать SVG с помощью ванильного JS?

Только начал открывать для себя SVG изучая немногочисленные туториалыРазобрался, что существует три способа анимации: SMIL, CSS, JS

83