Java / Firebase脚本执行多次

时间:2016-12-25 03:56:32

标签: javascript firebase firebase-realtime-database

我有一个有趣的问题。我正在做的一般想法是从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,只为那些对我潜在的计算机解锁诊断感到好奇的人。

全部谢谢!

2 个答案:

答案 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);
        }

全部设定!