Общее, что нужно понимать при отправке запросов, это то, что ожидается, что в начале вашего компонента не будет никаких данных, и вы ничего не можете с этим поделать.
Рекомендациисообщите пользователю, что данные загружаются.
constructor(){
this.state = {username: null, userId: null, loaded: false};
}
render() {
return (
<div className='App'>
{
!this.state.loaded ? <p>Loading...</p> :
<Header username={this.state.username}/>
<NewTask userId={this.state.userId}/>
<TaskList userId={this.state.userId}/>
}
</div>
);
}
Не выполняйте запросы на выборку в вашем контроллере!Используйте componentDidMount
componentDidMount(){
const userId = firebase.auth().currentUser.email;
this.giveUsername(userId);
}
Затем, наконец, в giveUsername
async giveUsername(userId){
let username;
await firebase.firestore().collection('users').where('email', '==', userId).get().then((snapshot) =>{
snapshot.docs.forEach(doc =>{
console.log(`doc.data().username - ${doc.data().username}`);
username = doc.data().username;
});
});
this.setState( {
userId : userId,
username : username,
loaded: true
});
}