react-redux ssr异步api调用未按预期工作

问题描述 投票:0回答:1

我正在尝试为我的React App实现服务器端渲染。我正在使用redux,也要thunk。

[当我尝试调度操作以调用该页面的API时。我想等待api调用完成,然后在服务器上呈现html并将其发送。但是我的承诺在得到api响应之前就已经解决了。

这是我的代码。

const promises = [];
  routes.map(({ route, match }) => {
    if (route && route.loadData) {
      const loadRes = route.loadData(store, match);
      console.log('l', loadRes);
      promises.push(loadRes);
    }
  });

  Promise.all(promises)
    .catch(() => promises)
    .then(() => {
      console.log('caall');
      render(req, res, store);
    });

我的路线

export default [
  {
    path: '/',
    component: Home,
    exact: true,
    loadData: (dispatch) => dispatch(getNews(0)),
  },
  {
    path: '/:pageNumber/page',
    component: Home,
    loadData: (store, match) => {
      return [store.dispatch(getNews(match.params.pageNumber))];
    },
  },
];

这是我的动作

export const getNews = (page) => async (dispatch) => {
  const response = await axios.get(
    `http://hn.algolia.com/api/v1/search?page=${page || 0}`
  );
  const res = await getHits(response.data);
  console.log('hit', res.length);

  dispatch({ type: 'UpdateNews', payload: res });
};

我不知道我在哪里做错了。渲染html后我很回应。

reactjs redux promise react-redux redux-thunk
1个回答
0
投票
  1. loadData路由中的/:pageNumber/page函数返回的是Promise数组,而不是Promise。因此,当您将嵌套数组传递给Promise.all()函数时,它会立即解析。
  2. loadData路由中的/函数签名不正确,因为您将store作为第一个参数传递,而不是调度。

也就是说,您应该按以下方式修改您的路线代码:

export default [
  {
    path: '/',
    component: Home,
    exact: true,
    loadData: ({ dispatch }) => dispatch(getNews(0)),
  },
  {
    path: '/:pageNumber/page',
    component: Home,
    loadData: (store, match) => {
      return store.dispatch(getNews(match.params.pageNumber));
    },
  },
];
© www.soinside.com 2019 - 2024. All rights reserved.