Я реализовал рендеринг на стороне сервера для моего приложения с 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 в консоли сервера до ответа сервера. Но редуктор срабатывает после ответа сервера.