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

Javascript 如何在firebase中手动拍摄多个快照,javascript,html,firebase,firebase-realtime-database,Javascript,Html,Firebase,Firebase Realtime Database,我正在使用javascript制作一个票证生成器。我正在使用firebase为用户提供一个已经存储在数据库中的代码。我的数据库布局如下: "qrcodes" : { "23KU8877" : { "email" : "person@email.com", "ticketgenerated" : "true" }, "288RX9U5" : { "email" : "person2@email.com",

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

"qrcodes" : {
    "23KU8877" : {
          "email" : "person@email.com",
          "ticketgenerated" : "true"
    },
    "288RX9U5" : {
          "email" : "person2@email.com",
          "ticketgenerated" : "true"
    }
}
我的脚本允许我获取qrcodes列表中的第一个代码,然后将其移动到另一个数据库中,由另一个网站处理。但我想找到一种方法,使函数在每次运行时都拍摄新的快照

从firebase获取数据的函数如下:

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

    while (functionruncount < inputnumber){
        grabfirebasecode();
    }    
}

function grabfirebasecode(){
    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"){
                    snapshot.forEach(function(childSnapshot) {
                        ref.child(childSnapshot.key).remove();
                    });
                    ref2.child(key).set({
                        email: ticketemail,
                        ticketgenerated: "true",
                    });
                    createticket();
                } 
            }

        });
    functionruncount ++;
}
函数generatehtml(){
ticketname=document.getElementById('name')。值;
ticketmail=document.getElementById('email')。值;
adultnumber=document.getElementById('成人')。值;
childnumber=document.getElementById('child')。值;
while(函数runcount
因此,如果上述代码成功运行并捕获qrcode列表的第一个子项(例如“23KU8877”),则无论函数循环多少次,它都将保持不变

我不知道如何解决这个问题。任何帮助都将不胜感激

谢谢,
丹尼尔·马丁内斯(Daniel Martinez)

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

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();
            } 
        }
    });
  }
}
因此,这段代码构建了一个承诺数组,异步发生的每个数据库操作对应一个承诺。当所有这些操作完成后,它会用一个情人号再次调用自己


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

我不确定我是否理解,但如果您问为什么查询总是读取相同的项,那是因为您执行了
ref.limitToFirst(1).
但我发现很难理解
grabfirebasecode
在这两种方式中试图做什么。你能描述一下它的目标吗?因为我不知道代码是什么(我试图使它随机),函数会在“qrcodes”列表下找到第一个子项并获取它的值。因此,使用页面顶部的数据库示例,“genvar”变量将等于“23KU8877”。if语句通过查看ticketgenerated变量if是否等于false来检查代码是否已用于另一个票证。如果它等于false,它将从存储所有代码的数据库中删除,然后将所有相同的数据上载到另一个数据库,在该数据库中,我有另一个网站向用户发送电子邮件。因此,由于我在函数运行后删除了该子项,我认为下一次函数运行时,它会接下一个孩子。让我们假设“23KU8877”在第一次运行时被删除,然后在第二次运行时,该函数将拾取“288RX9U5”,因为它现在已成为第一个受欢迎的孩子。我建议阅读异步操作和承诺,因为当您使用现代web API时,这些东西会不断出现。