Firebase数据库同步调用问题

时间:2018-09-29 17:51:37

标签: javascript firebase firebase-realtime-database

我是不熟悉Firebase的人。我正在使用Firebase数据库。在其中,我有两个节点,一个具有用户信息,第二个具有有关用户帖子的所有评论。这些是数据库结构

用户节点

Users node

评论节点 Comments node

我想做的是获取帖子的所有评论,然后使用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调用是异步的,因此未按正确的顺序进行调用。我想使其同步,就像先获取注释,然后为每个注释获取用户详细信息,然后继续下一个注释。请帮助我如何实现它,我已经在解决方案上花费了很多时间,并最终将其发布在这里。这不是其他问题的重复。

当前输出

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

我想要的输出

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

2 个答案:

答案 0 :(得分: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>');
               })
            });
        });

答案 1 :(得分:0)

您需要使用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方法。