我从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的值需要几秒钟。
问题是什么?为什么加载数据库的值需要这么多时间?或者设置值是一个问题吗?
答案 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();
});
})