Я хочу получить доступ к своей базе данных firebase, получить значение, а затем назначить его переменной, которая будет использоваться позже в коде.
<script src = "https://www.gstatic.com/firebasejs/5.5.0/firebase.js"></script>
var config = {
apiKey: "",
authDomain: "",
databaseURL: "",
projectId: "",
storageBucket: "",
messagingSenderId: ""
};
firebase.initializeApp(config);
database=firebase.database();
var ref = database.ref('test');
var firebaseMsg ='';
ref.on('value',function(snap){
//console.info(snap.val());
firebaseMsg=snap.val();
});
console.info(firebaseMsg);
моя база данных firebase выглядит так:
{
"test" : "Hello from my database!"
}
журнал консоли создает пустую строку, кажется, что назначение в обратном вызове ref.on не работает.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это происходит потому, что запросы к базе данных Firebase асинхронны: ваш console.info() выполняет до, возвращается функция обратного вызова, возвращаемая методом on().
Следующее будет работать:
ref.on('value',function(snap){
//console.info(snap.val());
firebaseMsg=snap.val();
console.info(firebaseMsg);
});
как вы, наверное, заметили, поскольку есть закомментированная строка console.info(snap.val());.
Это означает, что, например, вы можете обновить пользовательский интерфейс своего приложения (чтобы отразить изменение в базе данных) только из функции обратного вызова.
Если вы хотите использовать async / await, используйте метод once(), который является асинхронным и возвращает обещание, см. firebase.google.com/docs/reference/js/…. Метод on() - это слушатель, который возвращает функцию обратного вызова.
Ах, я понимаю, можно ли было бы использовать схему async / await, чтобы я мог принудительно извлечь свои данные, прежде чем я их console.info? Я пробовал это:
var firebaseMsg=''; async function queryFirebase(){ ref.on('value',function(snap){ firebaseMsg=await snap.val(); }); } queryFirebase(); console.info(firebaseMsg);Но я получаю сообщение об ошибке: «Ожидание действует только в асинхронной функции».