Теперь вы вызываете setState
после загрузки posts
, то есть до загрузки имени пользователя каждого пользователя. Таким образом, ваше приложение будет показывать пользователей без имен пользователей.
Чтобы убедиться, что оно отображает сообщения с именами пользователей, вам нужно будет позвонить setState
, когда все имена пользователей загрузятся. Это выглядит примерно так:
firebase.database().ref('posts').orderByChild('communityKey')
.equalTo('-M07uNj9HbQxc_ich644')
.on('value', (dataSnapshot) =>{
let promises = [];
dataSnapshot.forEach((child) => {
var userId = child.val().user
let userRef = firebase.database().ref('authenticatedUsers').child(userId);
promises.push(userRef.child('fullName').once('value'));
})
Promise.all(promises).then((snapshots) => {
return snapshots.map((userNameSnapshot) => userNameSnapshot.val());
}).then((userNames) => {
let postsList = [];
let index = 0;
dataSnapshot.forEach((child) => {
postsList.push({
image: child.val().image,
text: child.val().text,
user: userNames[index],
likesNumber: child.val().likesNumber,
commentsNumber: child.val().commentsNumber,
postKey: child.key
})
index = index + 1;
});
this.setState({ posts: postsList })
});
Что я изменил:
- Теперь пользователь загружен с прослушивателем
once()
вместо on()
. Это гарантирует, что вы не добавите еще одну копию сообщения, например, если имя пользователя изменится. Обратите внимание, что вы можете обрабатывать такие ситуации, но в этом случае вы захотите обновить существующую запись в postsList
вместо добавления новой копии. - Теперь слушатель загружает только имя пользователя, так как это все, что вы используете. Это уменьшит использование полосы пропускания.
- Он помещает все операции загрузки в массив
promises
, а затем использует Promise.all
, чтобы "дождаться" завершения всех из них. - Puts все имена пользователей в массиве
userNames
, в том же порядке, в каком они находятся в dataSnapshot
. - Создает
postsList
на основе массивов dataSnapshot
и userNames
. - Переводит результирующий список в состояние, чтобы React отображал его.
Стоит подумать, хотите ли вы вызывать setState
несколько раз.
Например: один раз, когда сообщения загружены, и один раз, когда каждое имя возвращается. Таким образом, вы сначала увидите сообщения без имен пользователей, а затем увидите, что каждое имя пользователя отображается в том виде, в котором оно загружено.
Кроме того, вы можете добавлять каждое сообщение только после того, как его имя пользователя будет опубликовано. Таким образом, в этом случае вы не будете звонить setState
после загрузки сообщений, а только после загрузки имени пользователя каждого сообщения.
Обе эти версии являются допустимыми, которые вы можете реализовать с помощью варианта код выше.