Просто добавьте return
перед fetch
в вашем действии. Это вернет обещание. Без этого undefined
возвращается неявно, что, очевидно, не является обещанием. Вот почему вы получаете Cannot read property 'then' of undefined
.
export const fetchForums = () => dispatch => {
return fetch('http://localhost:7373/forum/all?page=0&size=2')
.then(response => response.json())
.then(forums =>
dispatch({
type: 'FETCH_FORUMS',
payload: forums.content
})
);
};
Или вы можете удалить фигурные скобки. Это немного упростит код, и вам не нужно писать return
.
export const fetchForums = () => dispatch =>
fetch('http://localhost:7373/forum/all?page=0&size=2')
.then(response => response.json())
.then(forums =>
dispatch({
type: 'FETCH_FORUMS',
payload: forums.content
})
);
У вас также есть небольшая проблема в том, как вы используете цепочку fetchForums
и loadPosts
. Должно быть: this.props.fetchForums().then(() => loadPosts())
. Это полезно, если вам нужно передать параметры от вашего первого звонка. Или this.props.fetchForums().then(loadPosts)
Существует еще один современный подход, использующий ключевые слова async
и await
, но для этого вам могут понадобиться дополнительные инструменты, такие как babel.
async componentDidMount() {
await this.props.fetchForums();
loadPosts()
}
Обратите внимание, что если ваш второй вызов не зависит от результата первого вызова, вам не нужно ждать или связывать вызовы с обещаниями.
И, вероятно, ваша loadPosts
функция должна быть также избыточной, наряду с fetchForums
. Использование состояния для сообщений в этом случае нецелесообразно, возможно, вы можете передавать сообщения с подпорками и использовать их напрямую, а не сохранять в состоянии.