TLDR: Хорошо ли следующее промежуточное ПО для Redux или это плохая идея / плохая практика?Если это плохо, как еще вы могли бы использовать dispatch
с pipe или compose (декларативным способом)? Информацию о версии ES6 см. Ниже. Сначала я хотел открыть по вопросу о Redux GitHub, но, по-видимому, он позволяет только отчеты об ошибках и отсылает вас к StackOverflow ??♂️
// Purpose: have dispatch return its payload so that it
// can be used in pipes or compositions
export default function createPayloadReturner() {
return function wrapDispatchToAddPayloadReturn(next) {
return function dispatchAndReturn(action) {
function wrappedDispatch() {
next(action);
return action.payload;
}
if (action.payload) {
return wrappedDispatch();
}
return next(action);
};
};
}
Мотивация : В настоящее время я изучаю функциональное программирование.Я пишу приложение React с Redux для управления состоянием и Ramda, чтобы помочь мне с функциональным программированием.
У меня есть функция с именем login
, созданная asyncPipe
.Он принимает учетные данные, регистрирует пользователя, сохраняет токен и использует этот токен для выполнения аутентифицированного GET-запроса к серверу.Запрос гостя возвращает список одного или нескольких объектов (домов).
// Pseudo-code-ish
import { prop } from 'ramda';
const asyncPipe = (...fns) => x => fns.reduce(async (y, f) => f(await y), x);
const login = asyncPipe(
loginRequest,
prop('token'),
setToken,
getHouses,
)
// later (currently without the middleware)
const houseList = await login(credentials);
Теперь возникает проблема.Для начала я бы хотел dispatch
список ресторанов (dispatch(addHouses(houseList))
).Далее, если есть несколько домов, я бы хотел, чтобы пользователь перешел к экрану списка, чтобы он мог выбрать дом.Если есть только один дом, я хотел бы немедленно направить его в этот дом и выбрать его.Подбор означает dispatch(pickHouse(house))
.
Я задавал вопрос об этой проблеме в целом в этом вопросе.Комментатор предложил создать промежуточное программное обеспечение, чтобы dispatch
возвращал полезную нагрузку соответствующих действий и мог использоваться в конвейере.
Поэтому, используя Redux docs , я написал это:
export default () => next => action => {
const wrappedDispatch = () => {
next(action);
return action.payload;
};
if (action.payload) {
return wrappedDispatch();
}
return next(action);
};
Теперь вы можете использовать его в функции asyncPipe
, pipe
или compose
.
Это правильный способ вернуть полезную нагрузку?(Я проверил его, и промежуточное ПО, похоже, работает.) Это промежуточное ПО нормально, или оно нарушает некоторые передовые практики?