我正在使用javascript制作票证生成器。我正在使用Firebase为用户提供已经存储在数据库中的代码。我的数据库布局如下:
java
我的脚本允许我获取qrcodes列表中的第一个代码,然后将其移至另一个网站处理的另一个数据库。但是我想找到一种方法,使函数每次运行时都能拍摄新快照。
从firebase抓取数据的功能在这里:
"qrcodes" : {
"23KU8877" : {
"email" : "person@email.com",
"ticketgenerated" : "true"
},
"288RX9U5" : {
"email" : "person2@email.com",
"ticketgenerated" : "true"
}
}
因此,如果上面的代码成功运行并获取了qrcode列表的第一个子代(例如“ 23KU8877”),则无论该函数循环多少次,它都将保持不变。
我不确定如何解决此问题。任何帮助将不胜感激。
谢谢, 丹尼尔·马丁内斯
答案 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
数组中,以便在下一次迭代开始之前完成其工作。