Je veux récupérer tous les messages, puis avec chaque message, il y a un uid, en utilisant cet uid, je veux récupérer les informations de l'utilisateur

Mon code est comme ça mais il ne fonctionne pas et l'état ne change pas puis bloque

getAllPost(){ 
    let allPost = firebase.database().ref("all-post");
    let postAll = [];
    allPost.once("value").then(data => {
      data.forEach(function (childSnapshot) {
        let childData = childSnapshot.val();
        childData.postId = childSnapshot.key;
        let userInfo = firebase.database().ref(`users/${childData.uid}`);
        userInfo.once("value").then(data => {
          childData.userInfo = data;
          postAll.push(childData);        
        })
      })
    }).then(()=>{
      this.setState({ allPost: postAll,loading: false  },);
    }).catch(err => {
      this.setState({ loading: false });
    });
  }
0
Raam Meena 3 févr. 2020 à 14:54

1 réponse

Meilleure réponse

Comme l'a commenté Josh, vous ne gérez pas le fait que tous vos appels userInfo.once() sont asynchrones. Cela signifie qu'actuellement, votre appel this.setState({ allPost: postAll,loading: false },) est déclenché avant que le postAll.push(childData) ne se produise. Vous devriez pouvoir le voir facilement en ajoutant quelques instructions console.log.

La solution est d'attendre que tout le chargement soit terminé, en utilisant 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 });
});
2
Frank van Puffelen 3 févr. 2020 à 15:33