Извлечение (allpost) данных из firebase и использование uid также хотят получить информацию о пользователе - PullRequest
0 голосов
/ 03 февраля 2020

Я хочу получить все сообщения, затем для каждого сообщения есть идентификатор, используя этот идентификатор, я хочу получить информацию о пользователе.

Мой код такой, но он не работает, и состояние не меняется в этом блоке.

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 });
    });
  }

1 Ответ

2 голосов
/ 03 февраля 2020

Как заметил Джо 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 });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...