钥匙在火堆上重复出现

时间:2017-12-12 13:49:11

标签: javascript firebase firebase-realtime-database

我正在重复"键"来自Firebase,我没有找到任何涉及文档的内容。谁有这方面的经验可以传递为什么会发生这种情况的知识以及如何规避这个"错误"?

我刚刚创建了一个功能,以获取公司所包含的所有购物中心,之后通过这些购物中心获取他们的商品。但是"巴拉购物"正在重演。

PICTURE

CONSOLE

CODE:

function searchAllMarkers(){
    var markers = firebase.database().ref('/').child('aliansce');
    var arrMarkers = [];

    markers.on('child_added', function(snap){
        arrMarkers = [...arrMarkers, snap.key];
        console.log(arrMarkers);

        for(m in arrMarkers){
            console.log(arrMarkers[m])
            var markers = firebase.database().ref('/aliansce/').child('' + arrMarkers[m] +'/marker/markerCoordinates/');
            markers.on('child_added', function(snap){
                console.log(snap.val());
            });

        }

    });  
}

1 个答案:

答案 0 :(得分:1)

为每个子节点单独调用child_added回调,因为barrashopping一次,viapark一次。

每次调用它时,都会将节点添加到数组中,然后使用console.log(arrMarkers[m])记录数组。

  1. 第一次child_added触发barrashopping,您的数组包含[barrashopping]并且您记录barrashopping
  2. 第二次'child_added fires it's for viapark , so you array now contains [barrashopping,viapark] and you log barrashopping,viapark`。
  3. 您拥有的节点越多,使用当前代码打印barrashopping的频率就越高。阻止这种情况的一种方法是收听value事件,该事件会为符合您查询的所有子项触发一次:

    function searchAllMarkers(){
        var markers = firebase.database().ref('/').child('aliansce');
        var arrMarkers = [];
    
        markers.once('value', function(parent){
          parent.forEach(function(snap) {
            arrMarkers = [...arrMarkers, snap.key];
    
            for(m in arrMarkers){
                var markers = firebase.database().ref('/aliansce/').child('' + arrMarkers[m] +'/marker/markerCoordinates/');
                markers.once('child_added', function(snap){
                    console.log(snap.val());
                });
            }
    
            console.log(arrMarkers);
          }
        });  
    }