Я начинающий функциональный программист.Я работаю над приложением React Native, используя Ramda.Приложение позволяет пользователям обслуживать свои дома.
Я написал функцию под названием asyncPipe
, которая позволяет мне передавать обещания и обычные функции.Я использую его для loginFlow
, который в настоящее время имеет http-запрос (getHouseList
) в качестве последней функции.
const asyncPipe = (...fns) => x => fns.reduce(async (y, f) => f(await y), x);
const loginFlow = asyncPipe(
// ... someFunctions
getHouseList
);
// used later like this in LoginForm.js's handleSubmit():
const list = await loginFlow(credentials);
Итак, после входа в приложение приложение загружает дома пользователя.Теперь, в зависимости от того, есть ли у него только один или несколько домов, я бы хотел отправить пользователя либо в виде списка, чтобы выбрать дом, либо в детальный вид, если у него только один дом.Кроме того, я хотел бы отправить действие Redux, чтобы сохранить список в моем редукторе, и другое действие, чтобы выбрать дом, если есть только один.
В настоящее время я делаю это так:
const list = await loginFlow(credentials);
dispatch(addHouses(list));
if (list.length > 1) {
navigate('ListScreen')
} else {
dispatch(pickHouse(list[0]);
navigate('DetailScreen') ;
}
Но, как вы видите, это супер императив.Похоже, мне нужно «разветвлять» список и использовать его дважды в конвейере (потому что Redux dispatch
не имеет возвращаемого значения).
Мой главный вопрос:
Как сделать это более функциональным / декларативным (если есть способ)?
Небольшой подвопрос Iдолжно быть, хорошо ли это быть обязательным здесь / если делать это функционально - хорошая идея.