как получить ключ ссылки из ссылки, затем выполнить поиск по ключу и получить данные из этой ссылки - PullRequest
1 голос
/ 29 февраля 2020

Я хочу прочитать данные поста и получить ключ пользователя, затем выполнить поиск по нему и получить данные пользователя одновременно, и я попробовал это, но он делает шаг назад и не показывает имя пользователя, пока я делаю любые другие действия

вот база данных постов и аутентифицированных пользователей в режиме реального времени

enter image description here enter image description here

и вот код, который я попробовал

userFullName = ''
    listenForCommunityAndPosts = () =>  {
        try {

            firebase.database().ref('posts').orderByChild('communityKey')
            .equalTo('-M07uNj9HbQxc_ich644'/*this.props.navigation.getParam("communityKey")*/)
            //.startAt('-M07uNj9HbQxc_ich644'/this.props.navigation.getParam("communityKey")/)
            .on('value', (dataSnapshot) =>{
                var postsList = [];
                dataSnapshot.forEach((child) => {
                    var userId = child.val().user
                    /**************/
                    firebase.database().ref('authenticatedUsers').child(userId).on('value', snap => {this.userFullName =  snap.val().fullName})
                    /**************/
                    postsList.push({
                        image: child.val().image,
                        text: child.val().text,
                        //user: child.val().user,
                        user: this.userFullName,
                        likesNumber: child.val().likesNumber,
                        commentsNumber: child.val().commentsNumber,
                        postKey: child.key
                    })
                })
                this.setState({ posts: postsList })
            })
        }
        catch(e){
            alert(e.message)
        }

    }

1 Ответ

0 голосов
/ 29 февраля 2020

Теперь вы вызываете 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 после загрузки сообщений, а только после загрузки имени пользователя каждого сообщения.

Обе эти версии являются допустимыми, которые вы можете реализовать с помощью варианта код выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...