Как я могу вручную сделать несколько снимков в FireBase - PullRequest
0 голосов
/ 08 января 2019

Я делаю генератор билетов, используя 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 ++;
}

поэтому, если приведенный выше код выполняется успешно и захватывает первый дочерний элемент списка qrcode (например, «23KU8877»), он останется неизменным независимо от того, сколько раз функция зацикливается.

Я не уверен, как это исправить. Любая помощь будет оценена.

Спасибо, Даниэль Мартинес

1 Ответ

0 голосов
/ 09 января 2019

Вы подключаете одного и того же слушателя несколько раз в тесной петле. Все эти слушатели запускаются практически в одно и то же время, и поэтому все видят одно и то же значение из базы данных. Чтобы получить следующий код, убедитесь, что начинаете читать следующий код только после того, как удалили предыдущий. Обычный способ сделать это с помощью рекурсивной функции:

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, чтобы его работа была завершена до начала следующей итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...