Суть такая:
1. На странице в getInitialProps вызываю асинхронную функцию, получающую статистику пользователя.
class Statistics extends React.Component<StatisticsProps> {
static async getInitialProps({ req, res }: NextPageContext) {
const token = getCookie('authtoken', req);
if (!token) {
redirect('/auth', res);
return false;
}
store.dispatch(requestUserStatistics());
StatisticsService.getUserStatistics();
}
// Остальной код страницы
2. Ответ не жду, так как внутри функции есть вызов экшена, который по задумке должен обновлять глобальный стейт, данные которого по появлению отобразятся в нужных компонентах
export default class StatisticsService {
static async getUserStatistics(params?: Readonly<{ [key: string]: any }>) {
const res = await post<StatisticsResponse>(`/api/economics/lk/stat/`, params);
if(!res.data.error) {
// console.log("disp disp disp", res.data)
store.dispatch(receiveUserStatistics({result: res.data.result, result_total: res.data.result_total, chartFields: ["users", "visits"]}));
}
return res.data;
}
}
3. Внутри редьюсера, что в общем-то является последним шагом перед обновлением стейта, вижу, что данные приходят и готовы к записи
case RECEIVE_USER_STATISTICS:
console.log("received", action.statistics)
return {
...state,
statistics: action.statistics,
isLoadingStatistics: false
};
4. По какой-то причине не происходит апдейт стейта. И если проверять сам стейт, то никакой информации там нет. При этом, если мы перейдем на эту же страницу с другой(т.е. рендер будет не на сервере, а на клиенте), то данные подгружаются и все работает.
Если вынести вызов всей этой хурмы из getInitialProps в componentDidMount, то данные через секунду(столько идет запрос) так же появляются на странице.
componentDidMount() {
store.dispatch(requestUserStatistics());
StatisticsService.getUserStatistics();
}
Т.е. в первом случае не работает, а во втором работает. Почему так?
Есть мысль, что это из-за серверного рендеринга. Может быть так, что он делает запрос на сервере, но не дожидается ответа и возвращает страницу клиенту, в связи с чем теряется запись объекта в стейт?