首页 > 解决方案 > 在运行时在javascript中从firebase实时数据库动态获取数据

问题描述

我有以下问题:我想在运行时从 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;
    }

问题是它在数据加载到它之前重新运行数组。我也检查了文档并没有找到更好的解决方案。

提前致谢!

标签: javascriptfirebasefirebase-realtime-database

解决方案


这是因为getScoresOfPlayer函数selectedPlayerScores在方法返回的 promiseonce()解析之前返回。

您应该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) {
   ....
})

推荐阅读