如何在Firebase中手动拍摄多个快照

时间:2019-01-08 12:04:12

标签: javascript html firebase firebase-realtime-database

我正在使用javascript制作票证生成器。我正在使用Firebase为用户提供已经存储在数据库中的代码。我的数据库布局如下:

java

我的脚本允许我获取qrcodes列表中的第一个代码,然后将其移至另一个网站处理的另一个数据库。但是我想找到一种方法,使函数每次运行时都能拍摄新快照。

从firebase抓取数据的功能在这里:

"qrcodes" : {
    "23KU8877" : {
          "email" : "person@email.com",
          "ticketgenerated" : "true"
    },
    "288RX9U5" : {
          "email" : "person2@email.com",
          "ticketgenerated" : "true"
    }
}

因此,如果上面的代码成功运行并获取了qrcode列表的第一个子代(例如“ 23KU8877”),则无论该函数循环多少次,它都将保持不变。

我不确定如何解决此问题。任何帮助将不胜感激。

谢谢, 丹尼尔·马丁内斯

1 个答案:

答案 0 :(得分:1)

您要在一个紧密的循环中多次附加相同的侦听器。所有这些侦听器几乎同时启动,因此所有人都从数据库中看到相同的值。要获取下一个代码,必须确保仅在删除前一个代码之后才开始阅读下一个代码。常用的方法是使用递归函数:

function generatehtml(){
    ticketname = document.getElementById('name').value;
    ticketemail = document.getElementById('email').value;
    adultnumber = document.getElementById('adults').value;
    childnumber = document.getElementById('child').value;

    grabfirebasecode(inputnumber);
}

function grabfirebasecode(inputnumber){
  if (inputnumber > 0) {
    ref.limitToFirst(1).once('value', function(snapshot) {
        for(key in snapshot.val()){
            genvar = snapshot.child(key + "/ticketgenerated" ).val();
            var genvarpath = "test/" + key + "/ticketgenerated";
            if (genvar === "false"){
                var promises = [];
                snapshot.forEach(function(childSnapshot) {
                    promises.push(ref.child(childSnapshot.key).remove());
                });
                promises.push(
                  ref2.child(key).set({
                    email: ticketemail,
                    ticketgenerated: "true",
                  })
                );
                Promise.all(promises).then(function() {
                  grabfirebasecode(inputnumber-1);
                });
                createticket();
            } 
        }
    });
  }
}

因此,此代码构建了一个promise数组,每个异步发生的数据库操作一个。当所有这些操作完成后,它会再次用一个情人电话呼叫自己。

如果您的createticket()也执行异步操作,您可能还希望将其包含在promises数组中,以便在下一次迭代开始之前完成其工作。