Глобальный массив не обновляется, когда я вызываю функцию Firebase - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть несколько строк кода, которые извлекают данные из базы данных Firebase в реальном времени. Я хочу, чтобы они взяли имя из хранящихся там объектов, а затем использовали его, чтобы выбрать случайное имя. Сделайте это, сначала извлекая все объекты и сохраняя значения имен в массиве. Затем я получаю общее количество объектов в этой базе данных и использую функцию random для генерации случайного числа, а затем выбираю это значение из массива. Я не уверен, почему это не ведет себя как следует. Вот код, который я использую:

const dbRefObject = firebase.database().ref().child('names');


dbRefObject.on('value', gotData);
var names = [];
function gotData(data) {
    dbRefObject.once('value', function (snapshot) {
        snapshot.forEach(function (childSnapshot) {
            var childData = childSnapshot.val().names;
            names.push(childData);
        })
        namesUpdated(names);
    }
    )
    return names;
}

function namesUpdated(names) {
    randomNumber = randomNumberGenerator();
    console.log(randomNumber);
    console.log(names[randomNumber]);
    return names[randomNumber];
}

function randomNumberGenerator() {
    dbRefObject.on('value', (snap) => {
        var totalRecord = snap.numChildren();
        return Math.floor(Math.random() * totalRecord);
    });
}

Я не уверен, почему это не работает, так как когда я распечатываю массив имен в функции gotData, он работает нормально. Однако, когда я пытаюсь использовать это в namesUpdated, он говорит, что значение не определено. Аналогично, randomNumberGenerator работает нормально, так как возвращает значение в этой функции, но не работает, когда я использую его в namesUpdated. Эта функция выглядит хорошо для меня, поэтому я не уверен, почему она не работает. Заранее благодарю за любую помощь.

1 Ответ

0 голосов
/ 09 апреля 2020

В вашем коде есть несколько проблем. Я попытаюсь определить основные из них, и я бы предложил вам обновить ваш вопрос новой версией.

Во-первых, ИМХО, вам следует переместить объявление массива names В функцию gotData():

  function gotData(data) {
    var names = [];

Во-вторых, в функции randomNumberGenerator() вы должны использовать once() вместо on(). Вы также должны сделать return dbRefObject.once('value', (snap) => {...}).

Затем, в namesUpdated(), вы должны заметить, что вызов randomNumberGenerator() возвращает Обещание, поэтому вы не можете выполнить var randomNumber = randomNumberGenerator();. Вы должны либо использовать then(), либо использовать async/await.

Наконец, разделяя код в разных функциях, вы извлекаете базу данных несколько раз, без каких-либо дополнительных значений.

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