Метод отправки в промежуточном программном обеспечении не запускает редуктор - PullRequest
0 голосов
/ 07 ноября 2018

Использование метода сохранения dispatch из параметра, предоставленного промежуточным программным обеспечением Redux Thunk, не запускает редуктор. При использовании next() работает правильно, так как запускает редуктор. Почему это происходит?

middlerware

export default function createSlimAsyncMiddleware({
    dispatch,
    getState
}) {
    return next => action => {
    const {
        types,
        callAPI,
        shouldCallAPI = () => true,
    } = action;
    if (!actionIsValid(action)) next(action);
    if (shouldCallAPI(getState())) {
        return Promise.resolve(getState());
    }
    const [pendingType, successType, errorType] = types;
    dispatch({
        type: pendingType
    });
    return callAPI()
        .then(response => {
            dispatch({  // Does not work, use next()
                type: successType,
                payload: response,
            });
            console.log('call resolved with type', successType)
            return Promise.resolve(getState());
        })
        .catch(error => {
            dispatch({  // Does not work, use next()
                type: errorType,
                payload: error,
            });
            return Promise.reject(error);
        });
    };
}

магазин

const store = createStore(
    appReducer,
    composeWithDevTools(applyMiddleware(
    thunk,
    createSlimAsyncMiddleware,
    routerMiddleware(history)
    ))
)

Относительно этого ответа https://stackoverflow.com/a/36160623/4428183 dispatch также должен работать.

1 Ответ

0 голосов
/ 10 ноября 2018

Это указано в связанном ответе, который вы включили, но вызов dispatch() создаст новое действие, которое затем проходит всю цепочку промежуточного программного обеспечения с самого начала. В вашем случае это включает промежуточное программное обеспечение, которое вы устраняете. Из того, что я вижу, вы звоните next() только в том случае, если входящее действие считается недействительным. В противном случае последующий вызов API приводит к повторному вызову dispatch(), независимо от того, успешен он или нет, и поэтому действие никогда не попадает в редуктор, поскольку оно постоянно устанавливается в начале цепочки промежуточного программного обеспечения и никогда не продвигается через next().

Когда вы говорите, что этот код не работает, каково конкретное поведение? Ваше приложение зависает? Это сбой? Поскольку этот сценарий по существу устанавливает рекурсивную функцию без базового случая, я бы поспорил, что вы видите ошибки типа «максимальный стек вызовов превышен».

Полагаю, я бы спросил, почему вам нужно использовать dispatch() для результатов запроса, а не отправлять их вместе с помощью next(), или почему вы не настроили это так, чтобы установить условие, которое использует результат предыдущего вызова, чтобы определить, будет ли API вызываться снова.

...