Я создаю приложение для блога в рамках отдыха и реагировать. На домашней странице, под componentDidMount, я отправляю вызов API, используя axios, чтобы получить все статьи и setState из статей для возврата. Как я уже изучал, axios работает над идеей обещания, чтобы код не выполнялся, если API не извлекается для определенного компонента. Пожалуйста, скажите мне, если я ошибаюсь.
Затем я посылаю вызов GET, чтобы узнать имя автора, который написал статью по идентификатору. Хотя я предположил, что аксио работает как обещание. Но это не работает таким образом. Теперь я не знаю, как двигаться дальше.
Вот фрагмент. Итак, в mainBody.js
я делаю вызов API как:
class MainBody extends Component {
state = {};
componentDidMount () {
this.get_all_articles();
};
get_writer_name (id) {
let authstr = 'Bearer ' + window.localStorage.token;
let writer_url = "http://localhost:8000/api/writer/" + id.toString() + "/";
axios.get(writer_url, { headers: { Authorization: authstr }})
.then(response => {
console.log(response.data['name'])
return response.data['name'];
})
.catch(err => {
console.log("Got error")
})
};
get_all_articles () {
let authstr = 'Bearer ' + window.localStorage.token;
axios.get("http://localhost:8000/api/articles/", { headers: { Authorization: authstr }})
.then(response => {
this.setState({articles: response.data});
})
.catch(err => {
console.log("Got error")
})
}
render () {
return (
{this.state.articles.map((article, key) =>
<ArticleView key={article.id} article={article} writer_name={this.get_writer_name(article.created_by)} />
)}
)
}
}
В articleview2 я печатаю все данные, присутствующие в каждой из статей, вместе с именем автора.
Мой класс просмотра статьи:
class ArticleView extends Component {
state = {article: this.props.article};
componentDidMount() {
console.log(this.props.writer_name;
}
render () {
return (
<React.Fragment>
<h2>{article.title}</h2>
<p>{article.body}</p>
<span>{this.props.writer_name}</span>
</React.Fragment>
)
}
}
Если вы внимательно посмотрите, я написал два оператора console.log, чтобы получить имена писателей. В зависимости от порядка сначала запускается консольный журнал, представленный в классе articleview, который не определен, а затем после выборки данных из вызова API запускается консольный журнал, который возвращает правильное имя записывающего.
Я хотел знать, где ошибка? Кроме того, как я заметил, слишком много вызовов API делается для многократного получения имени автора для всех перечисленных статей. Каковы лучшие отраслевые практики для этих случаев?