从Firebase获取和显示数据需要时间

时间:2017-04-08 17:38:29

标签: javascript firebase firebase-realtime-database

我从Firebase数据库读取pid的值,然后使用此pid值,我从数据库中获取更多值。

//fetching pid
firebaseRef.once("value")
  .then(function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
      //getting key of the child
      var pid = childSnapshot.key;
      // childData will be the actual contents of the child
      var childData = childSnapshot.val();
      pid[i].id = "pid" + (i + 1);
      document.getElementById(pids[i].id).innerText = pid;
      i++;
    });
  });

//displaying marks
var pid1 = document.getElementById("pid1").innerHTML;
guideRef = firebase.database().ref("internal").child(pid1).child("guide");
guideRef.child("report").once('value').then(function(snapshot) {
  document.getElementById(reportGuideMarks).value = snapshot.val();
});

但是运行这段代码我得到了这个错误:

  

未捕获错误:Firebase.child失败:第一个参数是无效路径:""。路径必须是非空字符串,并且不能包含"。","#"," $"," [& #34;,或"]"

pid错误是由于pid1为空。但是,当我在“显示标记”上放置3秒的延迟时间。部分,代码运行完美。

即使在设置了pid值之前,也会执行显示标记。

在表格中设置pid的值需要几秒钟。

问题是什么?为什么加载数据库的值需要这么多时间?或者设置值是一个问题吗?

1 个答案:

答案 0 :(得分:1)

对firebase的请求是异步,因此“显示标记”代码将在“获取pid”代码完成之前运行。

您可以添加另一个then(),以便第二部分在第一部分完成之前不会运行

//fetching pid
firebaseRef.once("value")
  .then(function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
      //getting key of the child
      var pid = childSnapshot.key;
      // childData will be the actual contents of the child
      var childData = childSnapshot.val();
      pid[i].id = "pid" + (i + 1);
      document.getElementById(pids[i].id).innerText = pid;
      i++;
    });
  })
  // new then() won't fire until prior then() is completed
  .then(function() {    
    //displaying marks
    var pid1 = document.getElementById("pid1").innerHTML;
    guideRef = firebase.database().ref("internal").child(pid1).child("guide");
    guideRef.child("report").once('value').then(function(snapshot) {
      document.getElementById(reportGuideMarks).value = snapshot.val();
    });

  })