【问题标题】:Firebase database synchronous calls issueFirebase 数据库同步调用问题
【发布时间】:2018-09-29 17:51:36
【问题描述】:

我是火力基地的新手。我正在使用 firebase 数据库。在其中我有两个节点,一个具有用户信息,第二个具有来自用户的帖子上的所有 cmets。这些是数据库结构

用户节点

评论节点

我想要做的是获取帖子的所有 cmets,然后获取 from_key,这实际上是从该评论节点对帖子发表评论的用户密钥,然后从 firebase 获取该特定用户信息。我写了以下代码。

$(".all_firebase_keys").each(function () {
                    database.ref('comments/' + $(this).val()).on('child_added', function (snapshot) {
                        values = snapshot.val();
                        console.log(values.comment);
                        snapshot.forEach(function (path) {
                            if (path.key == "from_key") {
                                database.ref('users/' + values.from_key).once("value", function (user) {
                                    console.log(values.comment + "  " + user.val());
                                });
                            }
                        })
                    });
                });

我面临的问题是,由于 firebase 调用是异步的,它没有以正确的顺序进行调用。我想让它像首先获取 cmets 一样同步,然后为每个评论获取用户详细信息,然后继续下一条评论。请帮助我如何实现它我已经花了很多时间寻找解决方案并最终将其发布在这里。这不是其他问题的重复。

电流输出

  1. 评论1
  2. 评论2
  3. 用户 a
  4. 用户 b

我想要的输出

  1. 评论1用户a
  2. 评论 2 用户 b

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    最后,我在link 的帮助下自己找到了解决方案。我正在分享帮助链接,我的代码可能对其他人有帮助。

    $(".all_firebase_keys").each(function () {
                id = "#"+$(this).val();
                commentsRef.child($(this).val()).orderByChild('timestamp').on("child_added", function (snap) {
                   users = usersRef.child(snap.val().from_key);
                   users.once("value", function (snapshot) {
    
                       $("#"+snap.ref.parent.key).append('<p>'+snapshot.val().first_name +" "+ snap.val().comment+'</p>');
                   })
                });
            });
    

    【讨论】:

      【解决方案2】:

      你需要使用 Promises 之类的东西。

      可能是这样的:

          $(".all_firebase_keys").each(function () {
                      database.ref('comments/' + $(this).val()).on('child_added', async function (snapshot) {
                          values = snapshot.val();
                          console.log(values.comment);
      
                          for (value of values) {
                              data = await database.ref('users/' + value.from_key).once("value");
      
                               console.log(data);
                          }
                      });
                  });
      

      这只是一个例子。用于方法而不是 forEach。

      【讨论】:

      • @Emestyno 它仍然有同样的问题。
      猜你喜欢
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 2015-06-11
      相关资源
      最近更新 更多