【问题标题】:Firebase Realtime Database listener inside a loop is not working properly循环内的 Firebase 实时数据库侦听器无法正常工作
【发布时间】:2019-05-26 06:45:42
【问题描述】:

我正在使用 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 });
          })

})

【问题讨论】:

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


    【解决方案1】:

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

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

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

    任何一种方法都可以,但我个人更喜欢后者,因为它使读取数据的代码(这对可扩展性最关键)更简单。

    【讨论】:

    • 谢谢,我会继续你建议的替代方式。就前一种方法而言,我仍然不知道如何为每个 /allPosts/$postID 保留一个侦听器。我们不知道 $postID 是什么。所以,这个监听器必须在一个循环中,对吧?这就是我在编写的代码中尝试做的事情。有两个监听器,一个监听 /user/$userID/postsRelevantToThisUser 的变化,另一个监听器遍历结果并监听 /allPosts/$postID 。这个想法听起来不错,但我的代码(在 OP 中)不起作用。有什么见解吗?
    • 那个内部监听器应该可以工作,你只需要跟踪你附加的监听器,以便在某个时候清理它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2022-12-14
    • 1970-01-01
    • 2013-03-14
    • 2017-06-08
    相关资源
    最近更新 更多