Как заметил Джо sh, вы не учитываете тот факт, что все ваши userInfo.once()
вызовы являются асинхронными. Это означает, что сейчас ваш this.setState({ allPost: postAll,loading: false },)
вызов срабатывает до того, как postAll.push(childData)
произойдет. Вы можете легко увидеть это, добавив несколько операторов console.log
.
Решение состоит в том, чтобы дождаться завершения загрузки, используя Promise.all()
:
let allPost = firebase.database().ref("all-post");
let postAll = [];
allPost.once("value").then(data => {
let promises = [];
data.forEach(function (childSnapshot) {
let childData = childSnapshot.val();
childData.postId = childSnapshot.key;
let userInfo = firebase.database().ref(`users/${childData.uid}`);
promises.push(
userInfo.once("value").then(data => {
childData.userInfo = data;
postAll.push(childData);
})
})
})
return Promise.all(promises);
}).then(()=>{
this.setState({ allPost: postAll,loading: false },);
}).catch(err => {
this.setState({ loading: false });
});