react-redux ssr async api 调用未按预期工作
react-redux ssr async api call not working as expected
我正在尝试为我的 React 应用程序实现服务器端渲染。我正在使用 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 后响应。
- 你的
loadData
函数在 /:pageNumber/page
路由 returns 承诺数组而不是承诺。因此,当您将嵌套数组传递给 Promise.all()
函数时,它会立即解析。
- 您在
/
路由中的 loadData
函数签名不正确,因为您将商店作为第一个参数传递,而不是分派。
也就是说,您应该按如下方式修改路由代码:
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));
},
},
];
我正在尝试为我的 React 应用程序实现服务器端渲染。我正在使用 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 后响应。
- 你的
loadData
函数在/:pageNumber/page
路由 returns 承诺数组而不是承诺。因此,当您将嵌套数组传递给Promise.all()
函数时,它会立即解析。 - 您在
/
路由中的loadData
函数签名不正确,因为您将商店作为第一个参数传递,而不是分派。
也就是说,您应该按如下方式修改路由代码:
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));
},
},
];