Динамически получать данные из базы данных Firebase в реальном времени во время выполнения в JavaScript - PullRequest
0 голосов
/ 17 апреля 2019

У меня следующая проблема: я хочу получать данные с определенного узла из firebase во время выполнения. Он должен отображать «статистику» игрока, который был выбран ранее. Теперь я мог использовать on (), чтобы получить все данные в начале, но я хочу сохранить передачу данных, загружая данные только на плеер, если мне нужно, поэтому я попытался использовать один раз так:

    var firebaseRef = firebase.database().ref();

    function getScoresOfPlayer(player) {
      console.log(player);
      var selectedPlayerScores = [];

      firebaseRef.once('value').then(function(snap) {
        snap.child('scores').child('thierschi').forEach(function(child) {
          selectedPlayerScores.push([child.key, child.val()]);
        });
      });

      return selectedPlayerScores;
    }

Проблема в том, что он перезапускает массив до загрузки данных в него. Также я проверил документы и не нашел лучшего решения.

Заранее спасибо!

1 Ответ

1 голос
/ 17 апреля 2019

Это связано с тем, что функция getScoresOfPlayer возвращает selectedPlayerScores до разрешения обещания, возвращенного методом once().

Вы должны включить return в then() следующим образом:

var firebaseRef = firebase.database().ref();

function getScoresOfPlayer(player) {
  console.log(player);
  var selectedPlayerScores = [];

  return firebaseRef.once('value')  //return here as well
  .then(function(snap) {
    snap.child('scores').child(player).forEach(function(child) {  //I guess it should be child(player) and not child('thierschi') here
      selectedPlayerScores.push([child.key, child.val()]);
    });

    return selectedPlayerScores;
  });

}

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

getScoresOfPlayer('xyz')
.then(function(selectedPlayerScores) {
   ....
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...