我有一个有趣的问题。我正在做的一般想法是从Firebase数据库中提取数据,并根据该数据填充表格。在初始填充期间,所有东西都运行得很好 - 单元格和行按照它们应该填充,但奇怪的问题是脚本似乎是随机再次执行的。我已将传入的数据记录到控制台,并且可以在一段时间后看到它打印两次。
如果我要在页面之间导航或重新加载页面,则不会发生第二次执行 - 在这两种情况下,一切都按预期工作。锁定后我重新登录计算机时发生问题SEEMS ???有没有人知道这里会发生什么?以下脚本的相关部分:
const table = document.getElementById('myTable');
firebase.auth().onAuthStateChanged(firebaseUser => {
if (firebaseUser) {
let user = firebase.auth().currentUser;
let uid = user.uid;
const dbRef = firebase.database().ref().child("data/" + uid);
dbRef.once('value', snap => {
var dataCount = snap.child("secondData").numChildren();
var datalist = snap.child("secondData").val();
var dataArray = Object.keys(datalist).map(function(k) {
return datalist[k]
});
pullAllInfo(dataCount, dataArray);
});
}
});
function pullAllInfo(count, array) {
let k = 0;
let dataArray = [];
for (i = 0; i < count; i++) {
let specificRef = firebase.database().ref().child("secondData/" + array[i]);
specificRef.once('value', snap => {
var optionsTag = array[k];
k++;
var dataId = snap.child("id").val();
var dataName = snap.child("name").val();
var dataCount = snap.child("data").numChildren();
dataArray.push(dataId, dataName, dataCount, optionsTag);
if (k == count) {
buildTable(dataArray);
console.log(dataArray);
}
});
}
}
正如您从上面的代码中看到的那样,我为每个引用调用了.once()
,这可以防止典型的.on()
调用中的数据重复。似乎无法想出这一个。我也有一台iMac,只为那些对我潜在的计算机解锁诊断感到好奇的人。
全部谢谢!
答案 0 :(得分:1)
最有可能的是,身份验证状态正在改变并启动您的功能。尝试在这样的firebase.auth().onAuthStateChanged
下抛出一个日志:
firebase.auth().onAuthStateChanged(firebaseUser => {
console.log( 'auth state changed', firebaseUser );
if (firebaseUser) {
我的猜测是,当您从计算机注销/登录时,您会看到AuthState正在更改。
答案 1 :(得分:0)
我通过创建另一个名为preLoaded
的全局布尔值解决了这个问题。在开头,它被设置为false
,并且一旦数据被加载并传递以构建表,它就被设置为true
。它现在看起来像这样:
if(k == count && preloaded == false){
preloaded = true;
console.log(dataArray);
buildTable(dataArray);
}
全部设定!