Witam
Przechodząc z oop na FP walczę. Próbuję coś działać, ale sam nie wiem czy dobrze tworzę funkcje.
Chodzi mi o takie rozwiązanie. Wiem że stanów powinno się w FP unikać ale mniejsza z tym, może ktoś pomoże.
mamy funkcję które robią kolejne rzeczy :
- 1 sprawdza czy stan 'running == true ' = > checkThatIsRunning
- 2 jesli tak to pobiera z taba data - id i przekazuje do kolejnej = > getValuefromTab
- 3 odbiera data.id z poprzedniej i konwertuje na czas przesyła dalej => convertForTime
- 4 skonwertowany czas wrzuca w dom do elementu label = >
czy wywołanie funkcji poniżej może następować w taki sposób ? Event jest na parencie bo wykorzystuję go do toogle i pobrania data.id
No i tabów może być nieskończenie wiele.
I kolejne pytanie, co jeśli isRunning jest true, jak mam przerwać ten callback, mam wyłapywać do każdej funkcji drugi argument ?
Albo sprawdzać w każdej kolejnej funkcji czy argument jest nieprawidłowy aż dojdę do najwyższego elementu ?
Prosiłbym o jakąś sugestie. Chciałbym żeby w przypadku isRuning zwrócił np alert, ale nie wykonywał dalej callbacka tylko z tego wyszedł.
W przypadku kiedy isRunnig jest false robi dalej callback i przekazuje dane do elementu.
Znalazłem coś takiego :
https://medium.com/nmc-techblog/functional-error-handling-in-js-8b7f7e4fa092
Staram się coś deklaratywnie zacząć pisać, ale mózg stawia opór. Wiem że ifów powinienem unikać - podobnie statów
timerOptions.addEventListener("click", function (e) {
setCountDownTimerLabel(
convertForTime(getValuefromTab(checkThatIsRunning(e)))
);
});
Kolejne funkcje:
const checkThatIsRunning = function (e) {
if (state.pomodoro.isRunning) {
return;
}
const getValuefromTab = function (e) {
const data = +e.target.closest(".timer__options-btn").dataset.time;
if (!data) return;
state.pomodoro.currentTime = data;
return data;
};
const convertForTime = function (data) {
const sec = data;
let minutes = parseInt(sec / 60, 10);
let seconds = parseInt(sec % 60, 10);
minutes = minutes < 10 ? "0" + minutes : minutes;
seconds = seconds < 10 ? "0" + seconds : seconds;
const time = `${minutes}:${seconds}`;
return time;
};
const setCountDownTimerLabel = function (data) {
countDown.innerHTML = data;
return data;
};