база данных Firebase в реальном времени работает только во втором запросе - PullRequest
0 голосов
/ 14 июня 2019

каждый раз, когда я пытаюсь вызвать данные из базы данных в реальном времени, возвращает ноль с первой попытки, но получает правильные данные при втором запросе
, и это мой код

module.exports.getAllPosts = async () => {
  await db.dbRef.child("posts").on('value', function (snap) {
    temp = snap.val();
    return;
  });
  return temp;
};

Я использую асинхронныйфункция везде и до сих пор не работает, я использую экспресс для вызова этой функции

1 Ответ

1 голос
/ 14 июня 2019

Данные загружаются из Firebase асинхронно, как и во многих современных веб-API. Это означает, что основной код продолжает выполняться, и ваша функция обратного вызова вызывается после загрузки данных.

Лучше всего это можно увидеть, добавив в свой код некоторые записи:

console.log("Before attaching listener");
await db.dbRef.child("posts").on('value', function (snap) {
  console.log("Got data");
});
console.log("After attaching listener");

Когда вы запускаете этот код, вы получаете:

Перед подключением слушателя

После подключения слушателя

Получил данные

Вероятно, это не тот порядок, который вы ожидали. Но это полностью объясняет, почему ваш код не работает: к моменту запуска return temp данные еще не были загружены, и temp соответствует тому, что было до того, как вы начали загружать данные.

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

module.exports.getAllPosts = async () => {
  return await db.dbRef.child("posts").on('value', function (snap) {
    return snap.val();
  });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...