Реакция + Сервер рендеринга + Сервер отвечает, прежде чем API-ответ обновляется до редуктора при вызове API из redux-saga - PullRequest
0 голосов
/ 23 апреля 2020

Я реализовал рендеринг на стороне сервера для моего приложения с expressJS, реагирует и использует избыточность. Мой сервер отвечает до того, как результат API обновляется до редуктора. Я делаю вызов API из Redx-сага. Я добавил журнал консоли после успешного завершения API и смог увидеть результаты API. После этого запускается диспетчерское действие для обновления значения в редуктор. Но express сервер отвечает до того, как значение обновляется в редуктор. Это работает нормально, если я добавляю некоторое время ожидания, например 2000 мс, для ожидания на стороне сервера.

/**
* Server.js
*/
let preLoadedState = {
            context: {
                cookie: req.cookies,
            },
        };

        const store = storeFactory(preLoadedState, rootSaga);

        ReactDOMServer.renderToStaticMarkup(<Provider store={store} ><Router /></Provider>);
        const tasks = store.tasks;
        store.dispatch({type: 'CHANGE_STATE_CONTEXT_SHOULD_RENDER', payload: true});
        store.dispatch(END);

        Promise.all(tasks.map(task => task.done)).then(() => {
            const content = ReactDOMServer.renderToString(<Provider store={store} ><Router /></Provider>);
            const finalState = store.getState();
            console.log('************ final store', finalState);
            res.send(data.replace('<div id="root"></div>',
                `<div id="root">`+
                `${content}`+
                `</div>`+
                `<script> window.__PRELOADED_STATE__ = ${JSON.stringify(finalState).replace(/</g, '\\\u003c')}</script>`
            ));
        });

/**
* storeFactory.js
*/
const storeFactory = (initialState, rootSaga) => {
    const sagaMiddleware = createSagaMiddleware();
    const store = createStore(rootReducer, initialState, composeWithDevTools(applyMiddleware(sagaMiddleware)));
    store.tasks = rootSaga ? [sagaMiddleware.run(rootSaga)] : [];
    return store;
};

/**
* Saga.js
*/
export function* getExpenseList(action = {}) {
   try {
       const response = yield call(FactorySaga, ExpenseApi.getExpense, action.param);
       const { expenseList, storeList, categoryList } = response.result.data;
       console.log('********* getExpenseList saga******** expenseList');
       yield putResolve(initExpenseList(expenseList, storeList, categoryList));
   } catch (e) { console.log(e)}
}

Я могу получить журналы саг с расширением ExpenseList в консоли сервера до ответа сервера. Но редуктор срабатывает после ответа сервера.

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