Сохранение значения в глобальной переменной не проблема, это , когда сбивает вас с толку.
Данные загружаются из Firebase асинхронно.Это означает, что код работает не в том порядке, который вы, вероятно, ожидали.Вы можете легко увидеть это, поместив туда несколько записей:
console.log("Before starting to load value");
ref.child("path").on("value", snapshot => {
console.log("Loaded value");
});
console.log("After starting to load value");
Когда вы запускаете этот код, он печатает:
Перед началом загрузки значения
После начала загрузки значения
Загруженное значение
Вероятно, это не тот порядок, который вы ожидали.Но это прекрасно объясняет, почему глобальная переменная не устанавливается при обращении к ней: значение еще не вернулось из базы данных.
Вот почему вы захотите переместить код, которому нужны данные, избаза данных внутри функция обратного вызова.В качестве альтернативы вы можете использовать тот факт, что once()
возвращает обещание, что облегчает работу в результате:
function loadData() {
return ref.child("path").once("value");
});
loadData().then((snapshot) => {
... use the data from snapshot
});
Обратите внимание, что асинхронная загрузка является невероятно распространенным источником путаницы для разработчиков, которыеновичок в этом.Я настоятельно рекомендую проверить некоторые другие вопросы по теме: