循环内的Firebase Realtime Database侦听器无法正常工作

时间:2019-05-26 06:45:42

标签: javascript firebase react-native firebase-realtime-database

我正在使用Firebase实时数据库。我有一个对象,其中包含我们所有用户创建的所有帖子。这个物体很大。

为了快速显示帖子,我们为每个用户提供了一个具有相关帖子ID的对象。

结构如下:

/allPosts/$postID/
          : { $postID: {id: $postID, details: '', title: '', timestamp: ''} }

/user/$userID/postsRelevantToThisUser/
              : { $postID: {id: $postID} }

'postsRelevantToThisUser'仅包含帖子的ID。我需要遍历每个ID并从/ allPosts /

中检索整个帖子信息

结果,客户端将不必下载整个allPosts对象,并且该应用程序将更快。

为此,我编写了以下代码。它正在成功检索和呈现仅相关帖子。每当在Firebase实时数据库中的/ postsRelevantToThisUser /中添加或删除新的postID时,React Native都会正确地重新呈现该列表。

但是,当/ allPosts / $ postID中的任何内容发生更改时,例如:如果title参数发生更改,则不会反映在视图中。

什么是解决此问题的好方法?

let userPostRef = firebase.database().ref(`/users/${uid}/postsRelevantToThisUser`)

      userPostRef.on('value', (snapshot) => {
        let relPostIds = [];
        let posts = [];

        snapshot.forEach(function(childSnapshot) {
          const {id} = childSnapshot.val();
          relPostIds.push(id);
        })

        relPostIds.map(postId => {
          firebase.database().ref(`allPosts/${postId}`).on('value', (postSnapshot) => {
            let post  = postSnapshot.val()
            posts.push(post);
            this.setState({ postsToRender:posts });
          })

})

1 个答案:

答案 0 :(得分:0)

由于您已将显示帖子的数据分散到多个位置,因此,如果要获取有关该数据的实时更新,则需要将侦听器连接到多个位置。

因此,要监听标题更新,您需要保持一个监听器,以监听用户当前可以看到的每个/allPosts/$postID。虽然跟踪所有这些侦听器的代码可能有点挑剔,但实际上它们对于Firebase本身还是非常有效的,因此性能至少应达到几十个侦听器(并且用户不太可能会主动阅读)一次获得更多帖子标题。

或者,您可以在每个用户的/user/$userID/postsRelevantToThisUser节点下复制要在列表视图中显示的信息。这样,您可以复制更多数据,但不需要其他侦听器。

这两种方法都可以,但是我个人比较喜欢后者,因为它可使读取数据的代码(对于可伸缩性最关键)更简单。