Назначить значение из обратного вызова firebase

Я хочу получить доступ к своей базе данных 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 не работает.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
255
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это происходит потому, что запросы к базе данных 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, чтобы я мог принудительно извлечь свои данные, прежде чем я их console.info? Я пробовал это: var firebaseMsg=''; async function queryFirebase(){ ref.on('value',function(snap){ firebaseMsg=await snap.val(); }); } queryFirebase(); console.info(firebaseMsg); Но я получаю сообщение об ошибке: «Ожидание действует только в асинхронной функции».

James 20.09.2018 11:04

Если вы хотите использовать async / await, используйте метод once(), который является асинхронным и возвращает обещание, см. firebase.google.com/docs/reference/js/…. Метод on() - это слушатель, который возвращает функцию обратного вызова.

Renaud Tarnec 20.09.2018 12:33

Другие вопросы по теме