Redux: промежуточное ПО для возврата полезной нагрузки действий для функционального программирования - PullRequest
0 голосов
/ 21 февраля 2019

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.

Это правильный способ вернуть полезную нагрузку?(Я проверил его, и промежуточное ПО, похоже, работает.) Это промежуточное ПО нормально, или оно нарушает некоторые передовые практики?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...