Javascript 如何在firebase中手动拍摄多个快照
我正在使用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",
"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时,这些东西会不断出现。